事件传递、 手势GestureDetector

本文介绍了Android中事件传递的三个关键方法:dispatchTouchEvent(事件分发)、onInterceptTouchEvent(事件拦截)和onTouchEvent(事件处理)。同时,讨论了下拉刷新功能的实现,并提到了使用谷歌支持库的下拉刷新组件。此外,还涵盖了手势识别,如双击、滑动和按住移动等操作。

事件传递

Android的事件传递有下面三种方法:
1、dispatchTouchEvent 表示事件的分发
2、onInterceptTouchEvent 表示事件的拦截
3、onTouchEvent 表示事件的处理
返回值为false表示不拦截、不分发
下拉刷新:

package com.example.administrator.myrefreshdemo;

import android.animation.ObjectAnimator;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.FrameLayout;
import android.widget.ListView;

/**
 * Created by Administrator on 2015/9/24.
 */
public class MyRefreshLayout extends FrameLayout {
    ListView content;

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

    public MyRefreshLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        //先添加一个下拉刷新
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View header = inflater.inflate(R.layout.activity_fresh,null);
        addView(header);
        //再添加一个上边的view
        content = (ListView) inflater.inflate(R.layout.activity_listview,null);
        addView(content);

        ArrayAdapter <String> adapter = new ArrayAdapter<String>(context,android.R.layout.simple_list_item_1,new String[]{"a","b","c","d","e","f","a","b","c","d","e","f"});
        content.setAdapter(adapter);
    }

    public MyRefreshLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN){
            Log.d("mytouch","linearlayoutonInterceptTouchEvent"+ev.getAction()+super.onInterceptTouchEvent(ev));
        }
        if (content.getFirstVisiblePosition() == 0){
            View firstView = content.getChildAt(content.getFirstVisiblePosition());
            if (firstView.getY() >=0){
                Log.d("mytouch","拦截到事件");
                return true;
            }
        }
        return super.onInterceptTouchEvent(ev);
    }
    float y = 0;
    float oldY = 0;
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                oldY = event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                Log.d("mytouch","处理事件");
                y = event.getY();
                float distance = y - oldY;
                content.setTranslationY(content.getTranslationY()+distance);
                oldY = y;
                break;
            case MotionEvent.ACTION_UP:
                ObjectAnimator.ofFloat(content,"translationY",content.getTranslationY(),0).setDuration(300).start();
                break;
        }
        return true;
    }
}

布局文件

<com.example.administrator.myrefreshdemo.MyRefreshLayout
       android:layout_width="match_parent"
       android:layout_height="match_parent">

   </com.example.administrator.myrefreshdemo.MyRefreshLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/refresh"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="下拉刷新"
        android:textSize="20dp"
        android:gravity="center"
        android:padding="10dp"/>

</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff">

</ListView>

谷歌自己写的下拉刷新,用时需要support.v4包

public class MainActivity extends Activity {
    private SwipeRefreshLayout mSwipeRefreshLayout;
    private ListView mListView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swiperefreshlayout);
        mListView = (ListView) findViewById(R.id.listview);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,new String[]{"a","b","c","d","e","f","a","b","c","d","e","f"});
        mListView.setAdapter(adapter);
        mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener(){
            @Override
            public void onRefresh() {
                mSwipeRefreshLayout.setRefreshing(false);
            }
        });
    }
}

布局文件

 <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swiperefreshlayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ListView
            android:id="@+id/listview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"></ListView>

    </android.support.v4.widget.SwipeRefreshLayout>

手势

双击、滑动、按住移动

package com.example.administrator.myrefreshdemo;

import android.animation.ObjectAnimator;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;

import java.util.Objects;

/**
 * Created by Administrator on 2015/9/24.
 */
public class MyButton extends Button {
    private GestureDetector mGesture;

    //监听者模式
    interface onDoubleClick{
        public void onDoubleClick(View view);
    }
    private onDoubleClick onDoubleClickListener;

    public void setOnDoubleClickListener(onDoubleClick onDoubleClickListener) {
        this.onDoubleClickListener = onDoubleClickListener;
    }

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

    public MyButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        mGesture = new GestureDetector(context,new GestureDetector.SimpleOnGestureListener(){
            //双击按钮
            @Override
            public boolean onDoubleTap(MotionEvent e) {
                if (onDoubleClickListener!=null){
                    onDoubleClickListener.onDoubleClick(MyButton.this);
                }
                Log.d("mydoubletap","连续点击两次");
                return true;

            }

            //划一下,手离开屏幕后移动
            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                if (Math.abs(e2.getX()-e1.getX())>50){
                    Log.d("mydoubletap", "在X轴滑动");
//                    setTranslationX(e2.getX() - e1.getX());
                    ObjectAnimator.ofFloat(MyButton.this,"translationX",getTranslationX(),e2.getX() - e1.getX()).setDuration(800).start();
                    return true;
                }
                return super.onFling(e1, e2, velocityX, velocityY);
            }

            //随着手指在屏幕上move而move
            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                setTranslationX(getTranslationX()+e2.getX() - e1.getX());
                setTranslationY(getTranslationY()+e2.getY() - e1.getY());
                return true;
            }
        });
    }

    public MyButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        mGesture.onTouchEvent(event);
        return super.onTouchEvent(event);
    }
}
public class MainActivity extends Activity {

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

        MyButton button = (MyButton) findViewById(R.id.mybutton);
        button.setOnDoubleClickListener(new MyButton.onDoubleClick() {
            @Override
            public void onDoubleClick(View view) {
                Toast.makeText(getApplicationContext(),"双击两次",Toast.LENGTH_SHORT).show();
            }
        });
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值