20分鐘學(xué)會(huì)Android全手勢(shì)處理,你要的都有

以前都是迷茫過日子,沉迷游戲,也是被騰訊害了我的前半生。誰都有人生最灰暗的一段日子,索性后來被一耳光打醒,才開始懂得珍惜時(shí)間,才會(huì)覺得時(shí)間是最貴重的,得拼命地?cái)D。我的github13年申請(qǐng),前面是空白,最近就開始綠了,我相信堅(jiān)持下去,會(huì)種出一片草坪。


image.png

走過路過千萬不要錯(cuò)過,瞧一瞧看一看了,Android手勢(shì)操作大甩賣。這里有按下,抬起,點(diǎn)擊,長(zhǎng)按,左滑,右滑,上滑,下滑,放大縮小,應(yīng)有盡有。10塊錢打包帶走,你還在猶豫什么。

代碼傳送門

來一把事件操作大合唱:


giphy.gif
前提準(zhǔn)備:

GestureDetector 操作手勢(shì)識(shí)別器
ScaleGestureDetector 縮放手勢(shì)識(shí)別器
在onTouchEvent中,分別通過gestureDetector.onTouchEvent(event)
scaleGestureDetector.onTouchEvent(event),接手手勢(shì)事件
分別通過OnGestureListener和SimpleOnScaleGestureListener處理手勢(shì)事件。
事件監(jiān)聽器:

    class MyGestureDetectorListener implements GestureDetector.OnGestureListener{

        @Override
        public boolean onDown(MotionEvent e) {
            return false;
        }

        @Override
        public void onShowPress(MotionEvent e) {

        }

        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            return false;
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            return false;
        }

        @Override
        public void onLongPress(MotionEvent e) {

        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            return false;
        }
    }
    class MyScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {

        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            return super.onScale(detector);
        }

        @Override
        public boolean onScaleBegin(ScaleGestureDetector detector) {
            return super.onScaleBegin(detector);
        }

        @Override
        public void onScaleEnd(ScaleGestureDetector detector) {
            super.onScaleEnd(detector);
        }

    }

實(shí)現(xiàn)過程:
1.創(chuàng)建GestureFrame繼承RelativeLayout,創(chuàng)建手勢(shì)識(shí)別器

    private void init() {
        gestureDetector = new GestureDetector(getContext(),new MyGestureDetectorListener());
        scaleGestureDetector = new ScaleGestureDetector(getContext(),new MyScaleListener());
    }

2.在onTouchEvent中獲取按下,抬起事件;判斷起始點(diǎn)橫坐標(biāo)差值,判斷是左滑動(dòng)還是右滑動(dòng)。

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                startX = event.getX();
                callBack.callBack("按下");
                break;
            case MotionEvent.ACTION_UP:
                endX = event.getX();
                callBack.callBack("抬起");

                if(endX - startX > 200){
                    callBack.rightEvent();
                }else if(startX - endX > 200){
                    callBack.leftEvent();
                }
                break;
        }

        //將觸摸事件傳遞給手勢(shì)識(shí)別器處理
        gestureDetector.onTouchEvent(event);
        scaleGestureDetector.onTouchEvent(event);
        return true;
    }

3.onSingleTapUp()回調(diào)單擊事件;onScroll()回調(diào)上下左右拖動(dòng)事件;onLongPress()長(zhǎng)按事件;onScale()回調(diào)縮放事件,detector.getScaleFactor()獲取縮放比例;

    class MyGestureDetectorListener implements GestureDetector.OnGestureListener {

        @Override
        public boolean onDown(MotionEvent e) {

            return false;
        }

        @Override
        public void onShowPress(MotionEvent e) {

        }

        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            callBack.click(e.getX(),e.getY());
            callBack.callBack("單擊");
            return true;
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            curHeight += distanceY;
            callBack.callBackScale("上下滑動(dòng)  " + curHeight);
            //distanceX 左右滑動(dòng)值
            return false;
        }

        @Override
        public void onLongPress(MotionEvent e) {
            callBack.callBack("長(zhǎng)按");
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            return false;
        }
    }

    class MyScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {

        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            callBack.callBackScale("縮放比例: " + detector.getScaleFactor());
            return super.onScale(detector);
        }

        @Override
        public boolean onScaleBegin(ScaleGestureDetector detector) {
            return super.onScaleBegin(detector);
        }

        @Override
        public void onScaleEnd(ScaleGestureDetector detector) {
            super.onScaleEnd(detector);
        }

    }

GestureFrame完整代碼:

import android.content.Context;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.widget.RelativeLayout;

public class GestureFrame extends RelativeLayout{
    private GestureDetector gestureDetector;
    private ScaleGestureDetector scaleGestureDetector;
    private IcallBack callBack;
    private float startX;
    private float endX;
    private int curHeight;

    public GestureFrame(Context context) {
        super(context);
        init();
    }

    public GestureFrame(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        gestureDetector = new GestureDetector(getContext(),new MyGestureDetectorListener());
        scaleGestureDetector = new ScaleGestureDetector(getContext(),new MyScaleListener());
    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                startX = event.getX();
                callBack.callBack("按下");
                break;
            case MotionEvent.ACTION_UP:
                endX = event.getX();
                callBack.callBack("抬起");

                if(endX - startX > 200){
                    callBack.rightEvent();
                }else if(startX - endX > 200){
                    callBack.leftEvent();
                }
                break;
        }

        //將觸摸事件傳遞給手勢(shì)識(shí)別器處理
        gestureDetector.onTouchEvent(event);
        scaleGestureDetector.onTouchEvent(event);
        return true;
    }

    class MyGestureDetectorListener implements GestureDetector.OnGestureListener {

        @Override
        public boolean onDown(MotionEvent e) {

            return false;
        }

        @Override
        public void onShowPress(MotionEvent e) {

        }

        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            callBack.click(e.getX(),e.getY());
            callBack.callBack("單擊");
            return true;
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            curHeight += distanceY;
            callBack.callBackScale("上下滑動(dòng)  " + curHeight);
            //distanceX 左右滑動(dòng)值
            return false;
        }

        @Override
        public void onLongPress(MotionEvent e) {
            callBack.callBack("長(zhǎng)按");
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            return false;
        }
    }

    class MyScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {

        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            callBack.callBackScale("縮放比例: " + detector.getScaleFactor());
            return super.onScale(detector);
        }

        @Override
        public boolean onScaleBegin(ScaleGestureDetector detector) {
            return super.onScaleBegin(detector);
        }

        @Override
        public void onScaleEnd(ScaleGestureDetector detector) {
            super.onScaleEnd(detector);
        }

    }

    public interface IcallBack{
        void callBack(String string);
        void callBackScale(String scale);
        void leftEvent();
        void rightEvent();
        void click(float x,float y);
    }

    public void setCallback(IcallBack callback){
        this.callBack = callback;
    }

FocusBoxView完整代碼:

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.support.v7.widget.AppCompatImageView;
import android.util.AttributeSet;
import android.widget.RelativeLayout;

public class FocusBoxView extends AppCompatImageView {

    public FocusBoxView(Context context) {
        super(context);
    }

    public FocusBoxView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void startFocus(float x,float y){

        RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) getLayoutParams();
        layoutParams.leftMargin = (int) (x - getMeasuredWidth() / 2);
        layoutParams.topMargin = (int) (y - getMeasuredHeight() / 2);
        setLayoutParams(layoutParams);
        setVisibility(VISIBLE);
    }

}

Mainactivity回調(diào)設(shè)置值,顯示事件,左右滑動(dòng)動(dòng)畫

   import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private TextView textView;
    private GestureFrame gestureFrame;
    private StringBuilder stringBuilder;
    private TextView tvMsg;
    private FocusBoxView ivClick;

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

        gestureFrame = (GestureFrame) findViewById(R.id.gesture_frame);
        textView = (TextView) findViewById(R.id.tv);
        tvMsg = (TextView) findViewById(R.id.tv_Msg);
        ivClick = (FocusBoxView) findViewById(R.id.iv_click);

        stringBuilder = new StringBuilder();
        gestureFrame.setCallback(new GestureFrame.IcallBack() {
            @Override
            public void callBack(String string) {
                stringBuilder.append(string + "   ");
                textView.setText(stringBuilder.toString());
            }

            @Override
            public void callBackScale(String scale) {
                tvMsg.setText(scale);
            }

            @Override
            public void leftEvent() {
                TranslateAnimation animation = new TranslateAnimation(0,-300,0,0);
                animation.setDuration(300);
                tvMsg.startAnimation(animation);
                tvMsg.setText("左滑");
            }

            @Override
            public void rightEvent() {
                TranslateAnimation animation = new TranslateAnimation(0,300,0,0);
                animation.setDuration(300);
                tvMsg.startAnimation(animation);
                tvMsg.setText("右滑");
            }

            @Override
            public void click(float x, float y) {
                ivClick.startFocus(x,y);
            }
        });

    }

}

4.activity_main.xml布局:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.gestureuse.gestureuse.MainActivity">

    <com.example.gestureuse.gestureuse.GestureFrame
        android:id="@+id/gesture_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="15sp"/>

    <TextView
        android:id="@+id/tv_Msg"
        android:layout_width="150dp"
        android:layout_height="40dp"
        android:textSize="17sp"
        android:layout_centerInParent="true"
        android:textColor="#fff"
        android:gravity="center"
        android:background="@drawable/round_shape_halftrans"/>

    <com.example.gestureuse.gestureuse.FocusBoxView
        android:id="@+id/iv_click"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@mipmap/circle_green"/>

</RelativeLayout>

上下滑動(dòng)需要加一個(gè)標(biāo)志再觸發(fā),比如點(diǎn)擊才能觸發(fā),不然會(huì)和左右滑動(dòng)、縮放一起觸發(fā)。界面顯示效果沒有去弄美觀一些,還請(qǐng)見諒。程序猿持續(xù)進(jìn)化,博客持續(xù)更新,敬請(qǐng)期待。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容