Android : SeekBar 實現圖片旋轉縮放
Android 使用 SeekBar 控件實現圖片旋轉縮放。
圖片來源網絡地址。
使用工具
- android studio (ver. 3.5.1)
- android(sdk 29)
- java(ver.1.8.0)
- gradle(ver. 5.4.1)
功能實現
由於使用的圖片是網絡圖片,所以先在 AndroidManifest.xml 添加網絡權限:
<uses-permission android:name="android.permission.INTERNET"/>
在 onCreate() 創建一個 handler來接收子線程的消息更新下載的圖片
handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case DOWNLOAD_CODE:
/*
* 更新UI
* 提取消息中的bitmap,並設置ImageView
* */
Bitmap bitmap=(Bitmap) msg.obj;
if (bitmap!=null){
imageView.setImageBitmap(bitmap);//disPlay image
}
break;
case DOWNLOAD_FAIL:
Toast.makeText(MainActivity.this,"下載失敗",Toast.LENGTH_SHORT).show();
break;
}
}
自定義GetPictThread類實現Runnable類
public class GetPictThread implements Runnable{
//定義handler和path
public Handler handler;
public String path;
//帶參構造
public GetPictThread(Handler handler, String path) {
this.handler = handler;
this.path = path;
}
//在run方法中實現圖片下載
@Override
public void run() {
//通過Get方法請求獲取網絡圖片
try {
URL url=new URL(path);
HttpURLConnection connection=(HttpURLConnection) url.openConnection();
//設置請求方式
connection.setRequestMethod("GET");
//設置超時時間
connection.setConnectTimeout(30*1000);
//發起連接
connection.connect();
//獲取狀態碼
int requestCode=connection.getResponseCode();
System.out.println(requestCode);
if (requestCode==HttpURLConnection.HTTP_OK){
/*
* 1.獲得文件長度
* 2.通過緩沖輸入流
* 3.將輸入流轉換成字節數組
* 4.將字節數組轉換成位圖
* */
fileLength=connection.getContentLength();
InputStream is=new BufferedInputStream(connection.getInputStream());
//獲取到字節數組
byte[] arr=streamToArr(is);
//將字節數組轉換成位圖
mBitmap= BitmapFactory.decodeByteArray(arr,0,arr.length);
/*
* 下載完成后將消息發送出去
* 通知主線程,更新UI
* */
Message message=Message.obtain();
message.what=DOWNLOAD_CODE;
message.obj=mBitmap;
handler.sendMessage(message);
}else {
Log.e("TAG", "run:error "+requestCode);
}
}catch (MalformedURLException e){
e.printStackTrace();
handler.sendEmptyMessage(DOWNLOAD_FAIL);
}catch (IOException e){
e.printStackTrace();
handler.sendEmptyMessage(DOWNLOAD_FAIL);
}
}
}
將輸入流轉換成字節數組
public byte[] streamToArr(InputStream inputStream){
try {
ByteArrayOutputStream baos=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int len;
while ((len=inputStream.read(buffer))!=-1){
baos.write(buffer,0,len);
}
//關閉輸出流
baos.close();
//關閉輸入流
inputStream.close();
//返回字節數組
return baos.toByteArray();
}catch (IOException e){
e.printStackTrace();
//若失敗,則返回空
return null;
}
}
監聽圖片放大的 SeekBar
class seekBar1ChangeListenner implements SeekBar.OnSeekBarChangeListener {
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
int newWidth = progress + minWidth;
int newHeight = (int) (newWidth * 3 / 4);//按照原圖片的比例縮放
imageView.setLayoutParams(new LinearLayout.LayoutParams(
newWidth, newHeight));
}
監聽圖片旋轉的 SeekBar
class seekBar2ChangeListenner implements OnSeekBarChangeListener{
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
//Bitmap bitmap = ((BitmapDrawable) (getResources().getDrawable(R.drawable.p))).getBitmap();
Bitmap bitmap=mBitmap;
matrix.setRotate(progress);//設置翻轉的角度
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth() , bitmap.getHeight(), matrix,true);
imageView.setImageBitmap(bitmap);
textView2.setText(progress+"度");
}
}
演示
