天天看点

安卓控件使用系列16:ImageView实现图片缩放和旋转

在安卓中使用ImageView控件对图片进行旋转和缩放操作是经常遇到的开发背景,下面我们来分享一下它的实现方法。

这个例子实现的是通过滑动滑杆来控制图片的缩放和旋转,并显示缩放的大小和旋转的角度。

整体思路:首先在布局文件中定义一个ImageView控件,用于设置图片,放置两个SeekBar控件用于表示缩放和旋转的状态,放置两个TextView控件用于显示缩放的大小和旋转的角度;在活动中实现OnSeekBarChangeListener,在onProgressChanged这个方法中如果滑动的是第一个SeekBar控件,按比例设置图片的宽度和高度,并在TextView控件上显示图片的宽度和高度;如果滑动的是第二个SeekBar控件,把资源中的图片转换为位图,设置旋转角度,创建设置旋转了这个角度的位图,将这个位图绑定到这个ImageView控件上,并在TextView控件上显示旋转的角度。

activity_main.xml文件:

<LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >
    <ImageView
        android:id="@+id/imageview"
        android:layout_width="200dp"
        android:layout_height="150dp"
        android:src="@drawable/dog"
        android:scaleType="fitCenter"
        />
    <TextView 
        android:id="@+id/textview1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="宽度240,高度160"
        android:layout_marginTop="10dp"
        />
    <SeekBar 
        android:id="@+id/seekbar1"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:max="240"
        android:progress="120"
        android:layout_marginTop="10dp"
        />
    
    <TextView 
        android:id="@+id/textview2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="0度"
        android:layout_marginTop="10dp"
        />
    <SeekBar 
        android:id="@+id/seekbar2"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:max="360"
        />
</LinearLayout>
           

MainActivity.java文件:

public class MainActivity extends Activity implements OnSeekBarChangeListener{
    private int minWidth=80;
    private ImageView imageview;
    private TextView textview1,textview2;
    private SeekBar seekbar1,seekbar2;
    private Matrix matrix=new Matrix();//定义一个旋转的类,用来设置旋转的角度

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		imageview=(ImageView)findViewById(R.id.imageview);
		textview1=(TextView)findViewById(R.id.textview1);
		textview2=(TextView)findViewById(R.id.textview2);
		seekbar1=(SeekBar)findViewById(R.id.seekbar1);
		seekbar2=(SeekBar)findViewById(R.id.seekbar2);
		seekbar1.setOnSeekBarChangeListener(this);
		seekbar2.setOnSeekBarChangeListener(this);
	
//		这三个其实对本功能没有影响,可以去掉。
		DisplayMetrics dm=new DisplayMetrics();
		getWindowManager().getDefaultDisplay().getMetrics(dm);
		seekbar1.setMax(dm.widthPixels-minWidth);
	}

	@Override
	public void onProgressChanged(SeekBar seekBar, int progress,
			boolean fromUser) {
		// TODO Auto-generated method stub
		if(seekBar.getId()==R.id.seekbar1){
			int newWidth=progress+minWidth;
			int newHeight=(int)(newWidth*3/4);//按原图片比例进行缩放
			imageview.setLayoutParams(new LinearLayout.LayoutParams(newWidth,newHeight));
			textview1.setText("图像宽度"+newWidth+"图像宽度"+newHeight);
		}else if(seekBar.getId()==R.id.seekbar2){
			Bitmap bitmap=((BitmapDrawable)(getResources().getDrawable(R.drawable.dog))).getBitmap();
			matrix.setRotate(progress);//设置翻转的角度
			bitmap=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
			imageview.setImageBitmap(bitmap);
			textview2.setText(progress+"度");
		}
	}

	@Override
	public void onStartTrackingTouch(SeekBar seekBar) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onStopTrackingTouch(SeekBar seekBar) {
		// TODO Auto-generated method stub
		
	}

}