Android 多點觸摸 multi-touch

來源:互聯網
上載者:User
多點觸摸multi-touch

最近研究多點觸摸,做了個demo。Demo中實現多點觸摸縮放和使用按鈕點擊放大和縮小。注意2.0以上才支援多點觸摸。

程式碼如下:

package org.example.touch;

import android.app.Activity;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Matrix;

import android.graphics.PointF;

import android.hardware.SensorManager;

import android.os.Bundle;

import android.util.FloatMath;

import android.util.Log;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.View.OnTouchListener;

import android.widget.Button;

import android.widget.ImageView;

public class Touch extends Activity implements OnTouchListener, OnClickListener {

   private static final String TAG = "Touch" ;

   // These matrices will be used to move and zoom image

   Matrix matrix = new Matrix();

   Matrix savedMatrix = new Matrix();

   PointF start = new PointF();

   PointF mid = new PointF();

   float  oldDist;

   private ImageView view;

   private Button zoomIn, zoomOut;

   

   //button zoom

   private float scaleWidth = 1;

        private float scaleHeight = 1;

        private Bitmap bmp, zoomedBMP;

        private int zoom_level = 0;

        private static final double ZOOM_IN_SCALE = 1.25;//放大係數

        private static final double ZOOM_OUT_SCALE = 0.8;//縮小係數

      

   // We can be in one of these 3 states

   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);

      //放大按鈕

      zoomIn = (Button) findViewById(R.id.zoom_in);

       //縮小按鈕

      zoomOut = (Button) findViewById(R.id.zoom_out);

      zoomIn.setOnClickListener(this);

      zoomOut.setOnClickListener(this);

      view = (ImageView) findViewById(R.id.imageView);

      view.setOnTouchListener(this);

      //取得drawable中圖片,放大,縮小,多點觸摸的作用對象     

       bmp = BitmapFactory.decodeResource(Touch.this.getResources(), R.drawable.butterfly);

              }

   public boolean onTouch(View v, MotionEvent event) {

      // Handle touch events here...

      ImageView view = (ImageView) v;

      // Handle touch events here...

      switch (event.getAction() & MotionEvent.ACTION_MASK) {

        //設定拖拉模式

        case MotionEvent.ACTION_DOWN:

            savedMatrix.set(matrix);

            start.set(event.getX(), event.getY());

            Log.d(TAG, "mode=DRAG" );

            mode = DRAG;

            break;

         case MotionEvent.ACTION_UP:

         case MotionEvent.ACTION_POINTER_UP:

            mode = NONE;

            Log.d(TAG, "mode=NONE" );

            break;

         //設定多點觸摸模式

         case MotionEvent.ACTION_POINTER_DOWN:

            oldDist = spacing(event);

            Log.d(TAG, "oldDist=" + oldDist);

            if (oldDist > 10f) {

               savedMatrix.set(matrix);

               midPoint(mid, event);

               mode = ZOOM;

               Log.d(TAG, "mode=ZOOM" );

            }

            break;

          //若為DRAG模式,則點擊移動圖片

         case MotionEvent.ACTION_MOVE:

            if (mode == DRAG) {

               matrix.set(savedMatrix);

               // 設定位移

               matrix.postTranslate(event.getX() - start.x,

              event.getX() - start.x);

            }

            //若為ZOOM模式,則多點觸摸縮放

               else if (mode == ZOOM) {

               float newDist = spacing(event);

               Log.d(TAG, "newDist=" + newDist);

               if (newDist > 10f) {

                  matrix.set(savedMatrix);

                  float scale = newDist / oldDist;

                  //設定縮放比例和圖片中點位置

                  matrix.postScale(scale, scale, mid.x, mid.y);

               }

            }

            break;

      }

      // Perform the transformation

      view.setImageMatrix(matrix);

      return true; // indicate event was handled

   }

//計算移動距離

   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);

   }

//放大,縮小按鈕點擊事件

@Override

public void onClick(View v) {

        if(v == zoomIn){

                enlarge();

        }else if (v == zoomOut) {

                small();

        }

      

}

//按鈕點擊縮小函數

private void small() {

        int bmpWidth = bmp.getWidth();

        int bmpHeight = bmp.getHeight();

        scaleWidth = (float) (scaleWidth * ZOOM_OUT_SCALE);

        scaleHeight = (float) (scaleHeight * ZOOM_OUT_SCALE);

        Matrix matrix = new Matrix();

        matrix.postScale(scaleWidth, scaleHeight);

        zoomedBMP = Bitmap.createBitmap(bmp, 0, 0, bmpWidth, bmpHeight, matrix,

                        true);

        view.setImageBitmap(zoomedBMP);

}

//按鈕點擊放大函數

private void enlarge() {

        try {

                int bmpWidth = bmp.getWidth();

                int bmpHeight = bmp.getHeight();

                scaleWidth = (float) (scaleWidth * ZOOM_IN_SCALE);

                scaleHeight = (float) (scaleHeight * ZOOM_IN_SCALE);

                Matrix matrix = new Matrix();

                matrix.postScale(scaleWidth, scaleHeight);

                zoomedBMP = Bitmap.createBitmap(bmp, 0, 0, bmpWidth, bmpHeight, matrix,

                                true);

                view.setImageBitmap(zoomedBMP);

        } catch (Exception e) {

                //can't zoom because of memory issue, just ignore, no big deal

        }

      

}

}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.