zoukankan      html  css  js  c++  java
  • Android多点触摸放大缩小图片

     

    1.Activity

    package com.fit.touchimage;

    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    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.view.ViewGroup.MarginLayoutParams;
    import android.widget.ImageView;

    public class MainActivity extends Activity implements OnTouchListener {
        /** Called when the activity is first created. */
     
     //放大缩小
     Matrix matrix=new Matrix();
     Matrix savedMatrix=new Matrix();
     
     PointF start=new PointF();
     PointF mid=new PointF();
     float oldDist;
     
     private ImageView myImageView;
     
     //模式
     static final int NONE=0;
     static final int DRAG=1;
     static final int ZOOM=2;
     int mode=NONE;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
           
            myImageView=(ImageView) findViewById(R.id.myImage);
            myImageView.setOnTouchListener(this);
           
        }

     @Override
     public boolean onTouch(View v, MotionEvent event) {
      ImageView myImageView=(ImageView) v;
      switch(event.getAction()&MotionEvent.ACTION_MASK){
       //设置拖拉模式
      case MotionEvent.ACTION_DOWN:
       matrix.set(myImageView.getImageMatrix());
       savedMatrix.set(matrix);
       start.set(event.getX(),event.getY());
       mode=DRAG;
      break;
      case MotionEvent.ACTION_UP:
      case MotionEvent.ACTION_POINTER_UP:
       mode=NONE;
       break;
      
      //设置多点触摸模式
      case MotionEvent.ACTION_POINTER_DOWN:
       oldDist=spacing(event);
       if(oldDist>10f){
        savedMatrix.set(matrix);
        midPoint(mid, event);
        mode=ZOOM;
       }
       break;
       //若为DRAG模式,则点击移动图片
      case MotionEvent.ACTION_MOVE:
       if(mode==DRAG){
        matrix.set(savedMatrix);
        matrix.postTranslate(event.getX()-start.x,event.getY()-start.y);
       }
       //若为ZOOM模式,则点击触摸缩放
       else if(mode==ZOOM){
        float newDist=spacing(event);
        if(newDist>10f){
         matrix.set(savedMatrix);
         float scale=newDist/oldDist;
         //设置硕放比例和图片的中点位置
         matrix.postScale(scale,scale, mid.x,mid.y);
        }
       }
       break;
      } 
      myImageView.setImageMatrix(matrix);
      return true;
     }
     //计算移动距离
     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);
     }
    }

    2.布局

    <?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" android:gravity="center">
     <ImageView android:layout_width="fill_parent"
      android:layout_height="fill_parent" android:scaleType="matrix"
      android:id="@+id/myImage" android:src="@drawable/xiaoxiong"/>
    </LinearLayout>

  • 相关阅读:
    蓝书3.6 割点与桥
    蓝书3.5 强连通分量
    蓝书3.4 差分约束系统
    蓝书3.3 SPFA算法的优化
    蓝书3.2 最短路
    蓝书3.1 最小生成树
    luogu 4630 [APIO2018] Duathlon 铁人两项
    Codeforces Round #124 (Div. 1) C. Paint Tree(极角排序)
    dutacm.club Water Problem(矩阵快速幂)
    dutacm.club 1094: 等差区间(RMQ区间最大、最小值,区间GCD)
  • 原文地址:https://www.cnblogs.com/xgjblog/p/3874854.html
Copyright © 2011-2022 走看看