activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ImageView android:id="@+id/iv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="fitXY" android:src="@drawable/ic_launcher"/>
<!--
在这里总结一下scaleType属性的意思:
1、matrix:保持原图的效果(不随着ImageView的大小而变化),图片的左上角和ImageView的左上角对齐
2、fitXY: 不保持原图效果,x、y方向都进行缩放,也就是填充的效果
3、fitStart:不保持原图的效果,x、y按等比例的方式进行缩放到ImageView的宽度大小(所谓宽度就是边短的),图片的位置在ImageView开始的位置(左上角即为开始位置)
4、fitCenter:不保持原图的效果,x、y按等比例的方式进行缩放到ImageView的宽度大小(所谓宽度就是边短的),图片的位置在ImageView中间的位置
5、fitEnd:不保持原图的效果,x、y按等比例的方式进行缩放到ImageView的宽度大小(所谓宽度就是边短的),图片的位置在ImageView末尾的位置
6、center:保持原图的大小,当图片的大小>ImageView的大小时候,所显示的是图片中间的区域;当图片的大小<ImageView的大小时候,会位于ImageView的中心而不是屏幕的中心
7、centerCrop:不保持原图的大小,x、y等比例缩放到ImageView的高度大小(所谓高度就是边长的),图片居中显示,溢出部分不显示
8、centerInside:不保持原图的大小,当图片的大小>ImageView的大小,图片会按图片的宽高进行缩放到能够显示完整图片为止,当图片的大小<ImageView的大小,图片会保持原来的效果,居中显示
以上都为自己的总结,如有疑问可以自己进行尝试。
-->
<TextView android:id="@+id/tv1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="对图片进行缩放"/> <SeekBar android:id="@+id/seekBar1" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="对图片进行旋转"/> <SeekBar android:id="@+id/seekBar2" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
MainActivity.java:
package com.example.myimageview; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Matrix; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; public class MainActivity extends Activity implements OnSeekBarChangeListener { int windowWidth; int windowHeight; private Matrix matrix = new Matrix(); private ImageView iv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SeekBar seekBar1 = (SeekBar) findViewById(R.id.seekBar1); SeekBar seekBar2 = (SeekBar) findViewById(R.id.seekBar2); iv = (ImageView) findViewById(R.id.iv); seekBar1.setOnSeekBarChangeListener(this); seekBar2.setOnSeekBarChangeListener(this); //得到屏幕的宽高 DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); windowWidth = dm.widthPixels; windowHeight = dm.heightPixels; } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { //在这里处理相关的逻辑代码 if(seekBar.getId() == R.id.seekBar1){ //在这里执行缩放的操作 iv.setLayoutParams(new LinearLayout.LayoutParams(100+progress, windowHeight*2/5)); //之前我是这么写的iv.setlayoutParams(new ViewGroup.LayoutParams(100+progress, windowHeight*2/5))发生ViewGroup.LayoutParams向Linearlayout.LayoutParams强制转换错误 /* * Set the layout parameters associated with this view. These supply parameters to the parent of this view specifying how it should be arranged. * 此话的意思是设置此视图的布局关联的布局参数,此视图的父视图指定安排它的参数。(因为此视图的父视图是Linearlayout,当你写LinearLayout的父类ViewGroup的时候就会发生强转的错误) */ }else{ //在这里执行旋转的操作 matrix.setRotate(progress); @SuppressWarnings("deprecation") Bitmap bp = ((BitmapDrawable)(getResources().getDrawable(R.drawable.ic_launcher))).getBitmap(); /* * 上面的是Drawable向Bitmap进行转化 * Bitmap向BitmapDrawable转化的时候直接BitmapDrawable bd = new BitmapDrawable(Bitmap bit) */ //上面已经对矩阵进行了旋转,在这里只要由这个矩阵生成Bitmap就ok Bitmap scale_bp = Bitmap.createBitmap(bp, 0, 0, bp.getWidth(), bp.getHeight(), matrix, true); iv.setImageBitmap(scale_bp); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } @Override public void onStopTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } }