<?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

/** * 图片浏览、缩放、拖动、自动居中 */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中设置:

<?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中实现具体的需求

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

<?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. 36、Android(安卓)Bitmap 全面解析
  2. Android可缩放矢量图形(SVG)
  3. android photoview 图片放大缩放功能 ImageView
  4. Android(安卓)白板代码实现
  5. Android实现图片缩放与旋转
  6. Android(安卓)Drawable Resources系列7:
  7. Android(安卓)imageView图片按比例缩放
  8. Android(安卓)imageView图片按比例缩放
  9. Android文字的阴影效果

随机推荐

  1. Android多渠道打包方案的实践与优化
  2. android webrtc 视频流源码获取帧图像Vid
  3. 关于android eclipse 打包出现android-sd
  4. [UE4.4.x] 虚幻4 安卓打包
  5. 使用android画布的save()和restore()方法
  6. android 提权升级为root权限
  7. onCharacteristicChanged 回调问题
  8. Android(安卓)TextView显示html富文本格
  9. Android(安卓)首页Fragment切换常用姿势
  10. Android(安卓)使用自定义字体