1. 程式人生 > >安卓觸控手勢事件實現圖片跟著手指移動和圖片縮放

安卓觸控手勢事件實現圖片跟著手指移動和圖片縮放

效果如下:
在這裡插入圖片描述
佈局程式碼:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/root"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@mipmap/img1"
        android:orientation="vertical"
        tools:context=".MainActivity">



</LinearLayout>

主介面程式碼:

package com.example.beautyphtotos;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.LinearLayout;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener{
    /**
     * 手勢偵測器
     */
    private GestureDetector detector;
    /**
     * 影象標識陣列
     */
    private int[]imgIds;
    /**
     * 影象索引,表示在陣列中的位置
     */
    private int imgIndex;
    /**
     * 圖片數量
     */
    private static final int IMG_COUNT=23;
    /**
     * 根佈局
     */
    private LinearLayout linearLayout;
    /**
     * 應用程式標記
     */
    private final String TAG="swith_belle_image";




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //通過資源標識
        linearLayout=findViewById(R.id.root);
        //初始化影象標識陣列
        imgIds=new int[IMG_COUNT];
        for (int i=0;i<IMG_COUNT;i++){
            imgIds[i]=getResources().getIdentifier("img"+(i+1),"mipmap","com.example.beautyphtotos");
        }
        //例項化手勢偵測器(引數1:上下文環境,引數2:手勢監聽器物件)
        detector=new GestureDetector(this,this);
    }

    /**
     * 將視窗觸控事件交給手勢偵測器處理
     *
     */
    public boolean onTouchEvent(MotionEvent event){
        return detector.onTouchEvent(event);
    }

    @Override
    public boolean onDown(MotionEvent e) {
        Toast.makeText(MainActivity.this,"溫馨提示:左右滑動可切換圖片",Toast.LENGTH_SHORT).show();
        Log.d(TAG, "onDown");
        return true;
    }

    @Override
    public void onShowPress(MotionEvent e) {
        Log.d(TAG, "onShowPress");
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        Log.d(TAG, "onSingleTapUp");
        return true;
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        Log.d(TAG, "onDown");
        return true;
    }

    @Override
    public void onLongPress(MotionEvent e) {
        Log.d(TAG, "onLongPress");
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        Log.d(TAG, "onFling");
        //手勢往左滑動10個畫素,圖片切換到下一張
        if (e1.getX()-e2.getX()>=10){
            //更改影象索引
            if (imgIndex<IMG_COUNT-1){
                imgIndex++;
            }else {
                imgIndex=0;
            }
        }
        //手勢向右滑動10個畫素,圖片切換上一張
        if (e2.getX()-e1.getX()>=10){
            //更新影象索引
            if (imgIndex>0){
                imgIndex--;
            }else {
                imgIndex=IMG_COUNT-1;
            }
        }
        //利用更改後的影象索引去設定根佈局的背景圖片
        linearLayout.setBackgroundResource(imgIds[imgIndex]);
        //返回真事件處理到此完畢
        return true;
    }
}