在安卓中使用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 } }