android图片缩放平移
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:layout_gravity="center" >    <ImageView        android:id="@+id/imag"        android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:layout_gravity="center"        android:scaleType="matrix" >    </ImageView></FrameLayout>
View Code

      Android 图片的浏览、缩放、拖动和自动居中

转载地址:http://www.cnblogs.com/dwinter/archive/2012/01/12/2321082.html

  • Touch.java

android图片缩放平移
/** * 图片浏览、缩放、拖动、自动居中 */public class Touch extends Activity implements OnTouchListener {    Matrix matrix = new Matrix();    Matrix savedMatrix = new Matrix();    DisplayMetrics dm;    ImageView imgView;    Bitmap bitmap;    float minScaleR;// 最小缩放比例    static final float MAX_SCALE = 4f;// 最大缩放比例    static final int NONE = 0;// 初始状态    static final int DRAG = 1;// 拖动    static final int ZOOM = 2;// 缩放    int mode = NONE;    PointF prev = new PointF();    PointF mid = new PointF();    float dist = 1f;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.scale);        imgView = (ImageView) findViewById(R.id.imag);// 获取控件        bitmap = BitmapFactory.decodeResource(getResources(), this.getIntent()                .getExtras().getInt("IMG"));// 获取图片资源        imgView.setImageBitmap(bitmap);// 填充控件        imgView.setOnTouchListener(this);// 设置触屏监听        dm = new DisplayMetrics();        getWindowManager().getDefaultDisplay().getMetrics(dm);// 获取分辨率        minZoom();        center();        imgView.setImageMatrix(matrix);    }    /**     * 触屏监听     */    public boolean onTouch(View v, MotionEvent event) {        switch (event.getAction() & MotionEvent.ACTION_MASK) {        // 主点按下        case MotionEvent.ACTION_DOWN:            savedMatrix.set(matrix);            prev.set(event.getX(), event.getY());            mode = DRAG;            break;        // 副点按下        case MotionEvent.ACTION_POINTER_DOWN:            dist = spacing(event);            // 如果连续两点距离大于10,则判定为多点模式            if (spacing(event) > 10f) {                savedMatrix.set(matrix);                midPoint(mid, event);                mode = ZOOM;            }            break;        case MotionEvent.ACTION_UP:        case MotionEvent.ACTION_POINTER_UP:            mode = NONE;            break;        case MotionEvent.ACTION_MOVE:            if (mode == DRAG) {                matrix.set(savedMatrix);                matrix.postTranslate(event.getX() - prev.x, event.getY()                        - prev.y);            } else if (mode == ZOOM) {                float newDist = spacing(event);                if (newDist > 10f) {                    matrix.set(savedMatrix);                    float tScale = newDist / dist;                    matrix.postScale(tScale, tScale, mid.x, mid.y);                }            }            break;        }        imgView.setImageMatrix(matrix);        CheckView();        return true;    }    /**     * 限制最大最小缩放比例,自动居中     */    private void CheckView() {        float p[] = new float[9];        matrix.getValues(p);        if (mode == ZOOM) {            if (p[0] < minScaleR) {                matrix.setScale(minScaleR, minScaleR);            }            if (p[0] > MAX_SCALE) {                matrix.set(savedMatrix);            }        }        center();    }    /**     * 最小缩放比例,最大为100%     */    private void minZoom() {        minScaleR = Math.min(                (float) dm.widthPixels / (float) bitmap.getWidth(),                (float) dm.heightPixels / (float) bitmap.getHeight());        if (minScaleR < 1.0) {            matrix.postScale(minScaleR, minScaleR);        }    }    private void center() {        center(true, true);    }    /**     * 横向、纵向居中     */    protected void center(boolean horizontal, boolean vertical) {        Matrix m = new Matrix();        m.set(matrix);        RectF rect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());        m.mapRect(rect);        float height = rect.height();        float width = rect.width();        float deltaX = 0, deltaY = 0;        if (vertical) {            // 图片小于屏幕大小,则居中显示。大于屏幕,上方留空则往上移,下方留空则往下移            int screenHeight = dm.heightPixels;            if (height < screenHeight) {                deltaY = (screenHeight - height) / 2 - rect.top;            } else if (rect.top > 0) {                deltaY = -rect.top;            } else if (rect.bottom < screenHeight) {                deltaY = imgView.getHeight() - rect.bottom;            }        }        if (horizontal) {            int screenWidth = dm.widthPixels;            if (width < screenWidth) {                deltaX = (screenWidth - width) / 2 - rect.left;            } else if (rect.left > 0) {                deltaX = -rect.left;            } else if (rect.right < screenWidth) {                deltaX = screenWidth - rect.right;            }        }        matrix.postTranslate(deltaX, deltaY);    }    /**     * 两点的距离     */    private float spacing(MotionEvent event) {        float x = event.getX(0) - event.getX(1);        float y = event.getY(0) - event.getY(1);        return FloatMath.sqrt(x * x + y * y);    }    /**     * 两点的中点     */    private void midPoint(PointF point, MotionEvent event) {        float x = event.getX(0) + event.getX(1);        float y = event.getY(0) + event.getY(1);        point.set(x / 2, y / 2);    }}
View Code
  • scale.xml

android Matrix图片随意的放大缩小,拖动

转载地址:http://www.bdqn.cn/news/201304/8794.shtml

step1:新建一个项目DragAndZoom,并准备一张照片放在res/drawable-hdpi目录下,如下图所示:

(图片略)

step2: 设置应用的UI界面,在main.xml中设置:

android图片缩放平移
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    ><ImageView     android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:src="@drawable/wall"    android:id="@+id/imageView"    android:scaleType="matrix"     />  <!-- 指定为matrix类型 --></LinearLayout>
View Code

step3:MainActivity.java中实现具体的需求

android图片缩放平移
package cn.roco.drag;  import android.app.Activity;import android.graphics.Matrix;import android.graphics.PointF;import android.os.Bundle;import android.util.FloatMath;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.widget.ImageView;  public class MainActivity extends Activity {      private ImageView imageView;      @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);          imageView = (ImageView) this.findViewById(R.id.imageView);        imageView.setOnTouchListener(new TouchListener());    }      private final class TouchListener implements OnTouchListener {                  /** 记录是拖拉照片模式还是放大缩小照片模式 */        private int mode = 0;// 初始状态         /** 拖拉照片模式 */        private static final int MODE_DRAG = 1;        /** 放大缩小照片模式 */        private static final int MODE_ZOOM = 2;                  /** 用于记录开始时候的坐标位置 */        private PointF startPoint = new PointF();        /** 用于记录拖拉图片移动的坐标位置 */        private Matrix matrix = new Matrix();        /** 用于记录图片要进行拖拉时候的坐标位置 */        private Matrix currentMatrix = new Matrix();              /** 两个手指的开始距离 */        private float startDis;        /** 两个手指的中间点 */        private PointF midPoint;          @Override        public boolean onTouch(View v, MotionEvent event) {            /** 通过与运算保留最后八位 MotionEvent.ACTION_MASK = 255 */            switch (event.getAction() & MotionEvent.ACTION_MASK) {            // 手指压下屏幕            case MotionEvent.ACTION_DOWN:                mode = MODE_DRAG;                // 记录ImageView当前的移动位置                currentMatrix.set(imageView.getImageMatrix());                startPoint.set(event.getX(), event.getY());                break;            // 手指在屏幕上移动,改事件会被不断触发            case MotionEvent.ACTION_MOVE:                // 拖拉图片                if (mode == MODE_DRAG) {                    float dx = event.getX() - startPoint.x; // 得到x轴的移动距离                    float dy = event.getY() - startPoint.y; // 得到x轴的移动距离                    // 在没有移动之前的位置上进行移动                    matrix.set(currentMatrix);                    matrix.postTranslate(dx, dy);                }                // 放大缩小图片                else if (mode == MODE_ZOOM) {                    float endDis = distance(event);// 结束距离                    if (endDis > 10f) { // 两个手指并拢在一起的时候像素大于10                        float scale = endDis / startDis;// 得到缩放倍数                        matrix.set(currentMatrix);                        matrix.postScale(scale, scale,midPoint.x,midPoint.y);                    }                }                break;            // 手指离开屏幕            case MotionEvent.ACTION_UP:                // 当触点离开屏幕,但是屏幕上还有触点(手指)            case MotionEvent.ACTION_POINTER_UP:                mode = 0;                break;            // 当屏幕上已经有触点(手指),再有一个触点压下屏幕            case MotionEvent.ACTION_POINTER_DOWN:                mode = MODE_ZOOM;                /** 计算两个手指间的距离 */                startDis = distance(event);                /** 计算两个手指间的中间点 */                if (startDis > 10f) { // 两个手指并拢在一起的时候像素大于10                    midPoint = mid(event);                    //记录当前ImageView的缩放倍数                    currentMatrix.set(imageView.getImageMatrix());                }                break;            }            imageView.setImageMatrix(matrix);            return true;        }          /** 计算两个手指间的距离 */        private float distance(MotionEvent event) {            float dx = event.getX(1) - event.getX(0);            float dy = event.getY(1) - event.getY(0);            /** 使用勾股定理返回两点之间的距离 */            return FloatMath.sqrt(dx * dx + dy * dy);        }          /** 计算两个手指间的中间点 */        private PointF mid(MotionEvent event) {            float midX = (event.getX(1) + event.getX(0)) / 2;            float midY = (event.getY(1) + event.getY(0)) / 2;            return new PointF(midX, midY);        }      }  }
View Code

step4:AndroidMainfest.xml

android图片缩放平移
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"      package="cn.roco.drag"      android:versionCode="1"      android:versionName="1.0">    <uses-sdk android:minSdkVersion="8" />      <application android:icon="@drawable/icon" android:label="@string/app_name">        <activity android:name=".MainActivity"                  android:label="@string/app_name">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>      </application></manifest>
View Code

更多相关文章

  1. Android RatingBar自定义替换系统图片
  2. Android可缩放矢量图形(SVG)
  3. android photoview 图片放大缩放功能 ImageView
  4. Android图片太大导致无法正常显示
  5. 不停地切换两张图片ViewFlipper
  6. Android实现图片缩放与旋转
  7. Android Studio点击按钮更换背景图片
  8. android图片放大 缩小 旋转

随机推荐

  1. android 关闭软键盘
  2. Android固件img文件的解包, 修改和打包的
  3. 常见问题汇总一
  4. Android(安卓)开发中的常用的上传下载接
  5. android 弹出对话框
  6. android 笔记:判断手机是否显示虚拟按键
  7. Android(安卓)APP 启动时间统计
  8. Android实现EditText正则表达式过滤
  9. android拼接多张bitmap图片
  10. Android判断是否有网络连接