溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

【移動(dòng)開(kāi)發(fā)】Android中圖片的多點(diǎn)觸控和縮放

發(fā)布時(shí)間:2020-10-17 05:24:44 來(lái)源:網(wǎng)絡(luò) 閱讀:3810 作者:zhf651555765 欄目:開(kāi)發(fā)技術(shù)

   前幾天做項(xiàng)目用到相機(jī)拍照,之后能對(duì)圖片進(jìn)行縮放,拖拽,在此我將其單獨(dú)抽取出來(lái),后面用到時(shí)直接拿來(lái)用就行了!

效果圖:

【移動(dòng)開(kāi)發(fā)】Android中圖片的多點(diǎn)觸控和縮放

  注:這里不僅能按鈕縮放,還能多點(diǎn)觸摸縮放和拖拽功能!

1.布局:

<?xml version="1.0" encoding="UTF-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/flayout_img_display"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <LinearLayout
        android:id="@+id/linearLayout_img_display"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_gravity="center"
        android:gravity="center" >
        <ImageView
            android:id="@+id/img_display"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:paddingBottom="5.0dip"
            android:paddingTop="5.0dip"
            android:scaleType="matrix" />
    </LinearLayout>
    <RelativeLayout
        android:id="@+id/relativeLayout1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
        <Button
            android:id="@+id/btn_min"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true"
            android:enabled="false"
            android:text="縮小" />
        <Button
            android:id="@+id/btn_out"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:text="放大" />
    </RelativeLayout>
</FrameLayout>

2.就一個(gè)類:

import android.app.Activity;
import android.content.Intent;
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.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.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
/**
 * 縮放圖片界面
 * @author ZHF
 *
 */
public class MainActivity extends Activity {
    public static final String TAG = "ImgDisplayActivity";
    //控件聲明
    private Button btnZoomin, btnZoomout;
    private ImageView imgDisPlay;
    private LinearLayout lLayoutDisplay;
    private FrameLayout fLayoutDisplay;
                                                                                                           
    private Bitmap bitmap;
                                                                                                           
    private int imgId = 0;
    private double scale_in = 0.8;//縮小比例
    private double scale_out = 1.25;//放大比例
                                                                                                           
    private float scaleWidth = 1;
    private float scaleHeight = 1;
    //模式:0:什么都不干;1:拖拽; 2:縮放
    public static final int NONE = 0;
    public static final int DRAG = 1;
    public static final int ZOOM = 2;
    //聲明觸發(fā)的事件模式
    private int mode = NONE;
                                                                                                           
    private Matrix matrix;   //矩陣
    private Matrix currMatrix; //當(dāng)前矩陣
                                                                                                           
    private PointF starPoint;
    private PointF midPoint;
                                                                                                           
    private float startDistance;
                                                                                                           
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化
        fLayoutDisplay = (FrameLayout) findViewById(R.id.flayout_img_display);
        lLayoutDisplay = (LinearLayout) findViewById(R.id.linearLayout_img_display);
        imgDisPlay = (ImageView) findViewById(R.id.img_display);
        btnZoomin = (Button) findViewById(R.id.btn_min);
        btnZoomout = (Button) findViewById(R.id.btn_out);
                                                                                                               
                                                                                                               
        matrix = new Matrix(); //保存拖拽變化
        currMatrix = new Matrix();// 當(dāng)前的
        starPoint = new PointF();//開(kāi)始點(diǎn)的位置
                                                                                                               
                                                                                                               
        btnZoomin.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                zoomIn();
            }
        });
        btnZoomout.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                zoomOut();//放大
            }
        });
                                                                                                               
        imgDisPlay.setImageResource(R.drawable.img);
        //給圖片綁定監(jiān)聽(tīng)器哦
        imgDisPlay.setOnTouchListener(new ImageViewOnTouchListener());
                                                                                                               
    }
                                                                                                           
    /**放大操作**/
    private void zoomOut() {
        reSizeBmp(scale_out);
        btnZoomin.setEnabled(true);
    }
                                                                                                           
    /**縮小操作**/
    private void zoomIn() {
        reSizeBmp(scale_in);
    }
                                                                                                           
    /**接收傳入的縮放比例實(shí)現(xiàn)縮放**/
    private void reSizeBmp(double scale) {
        //縮放比例
        scaleWidth = (float) (scaleWidth * scale);
        scaleHeight = (float) (scaleHeight * scale);
                                                                                                               
        Matrix matrix = new Matrix();
        matrix.postScale(scaleWidth, scaleHeight); //設(shè)計(jì)縮放比例
                                                                                                               
        imgDisPlay.setImageMatrix(matrix);
    }
                                                                                                           
    /**計(jì)算觸摸實(shí)現(xiàn)縮放**/
    final class ImageViewOnTouchListener implements OnTouchListener{
        @Override
        public boolean onTouch(View v, MotionEvent event) {
                                                                                                                   
            switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:  //一只手指按下
                Log.i(TAG,"一只手指按下");
                currMatrix.set(matrix);
                starPoint.set(event.getX(), event.getY());
                                                                                                                       
                mode = DRAG;
                break;
            case MotionEvent.ACTION_POINTER_DOWN: //如果有一只手指按下屏幕,后續(xù)又有一個(gè)手指按下     // 兩只手指按下
                Log.i(TAG,"又有一只手指按下");
                                                                                                                       
                startDistance = distance(event);//記下兩點(diǎn)的距離
                Log.i(TAG, startDistance+"");
                                                                                                                       
                if(startDistance > 5f) {  //兩個(gè)手指之間的最小距離像素大于5,認(rèn)為是多點(diǎn)觸摸
                    mode = ZOOM;
                    currMatrix.set(matrix);
                                                                                                                           
                    midPoint = getMidPoint(event); //記下兩個(gè)點(diǎn)之間的中心點(diǎn)
                                                                                                                           
                }
                                                                                                                       
                break;
                                                                                                                       
            case MotionEvent.ACTION_MOVE:
                                                                                                                       
                if(mode == DRAG) {  //拖拽模式
                    Log.i(TAG,"一只手指在拖拽");
                                                                                                                           
                    //開(kāi)始--》結(jié)束點(diǎn)的距離
                    float dx = event.getX() - starPoint.x;
                    float dy = event.getY() - starPoint.y;
                                                                                                                           
                    matrix.set(currMatrix);
                    matrix.postTranslate(dx, dy);//移動(dòng)到指定點(diǎn):矩陣移動(dòng)比例;eg:縮放有縮放比例
                } else if(mode == ZOOM) {  //縮放模式
                    Log.i(TAG,"正在縮放");
                                                                                                                           
                    float distance = distance(event);  //兩點(diǎn)之間的距離
                    if(distance > 5f) {
                        matrix.set(currMatrix);
                        float cale = distance / startDistance;
                        matrix.preScale(cale, cale, midPoint.x, midPoint.y);  //進(jìn)行比例縮放
                    }
                }
                break;
                                                                                                                       
            case MotionEvent.ACTION_UP: //最后一只手指離開(kāi)屏幕后觸發(fā)此事件
            case MotionEvent.ACTION_POINTER_UP: //一只手指離開(kāi)屏幕,但還有一只手指在上面會(huì)觸此事件
                //什么都沒(méi)做
                mode = NONE;
                break;
            default:
                break;
            }
                                                                                                                   
            imgDisPlay.setImageMatrix(matrix);
                                                                                                                   
            //兩只手指的縮放
            return true;
        }
    }
                                                                                                           
    /**計(jì)算兩點(diǎn)之間的距離像素**/
    private float distance(MotionEvent e) {
                                                                                                               
        float eX = e.getX(1) - e.getX(0);  //后面的點(diǎn)坐標(biāo) - 前面點(diǎn)的坐標(biāo)
        float eY = e.getY(1) - e.getY(0);
        return FloatMath.sqrt(eX * eX + eY * eY);
    }
                                                                                                           
    /**計(jì)算兩點(diǎn)之間的中心點(diǎn)**/
    private PointF getMidPoint(MotionEvent event) {
                                                                                                               
        float x = (event.getX(1) - event.getX(0)) / 2;
        float y = (event.getY(1) - event.getY(0)) / 2;
        return new PointF(x,y);
    }
}


    ok!主要的算法就在ImageViewOnTouchListener監(jiān)聽(tīng)器當(dāng)中,要考慮那三種情況(縮放、拖拽、什么都不干),另外需要注意的就是,單個(gè)手指和兩個(gè)以上手指的情況。


×××:http://down.51cto.com/data/876165

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI