zoukankan      html  css  js  c++  java
  • 事件分发

    dispatchTouchEvent-向下分发操作

    onInterceptTouchEvent-拦截操作(1.Activity和TextView没有,Layout有;2.true-拦截、false-不拦截)

    onTouchEvent-处理操作(true-处理、false-不处理)

    1.textview点击事件

    <org.mobiletrain.touchevent.MyLinearLayout
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:layout_centerInParent="true"
            android:background="#ff0303"
            android:gravity="center">
    
            <org.mobiletrain.touchevent.MyTextView
                android:layout_width="100dp"
                android:layout_height="100dp"
                android:background="#18ff03"/>
        </org.mobiletrain.touchevent.MyLinearLayout>
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
            Log.d("lenve", "MainActivity - dispatchTouchEvent: ");
            return super.dispatchTouchEvent(ev);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            Log.d("lenve", "MainActivity - onTouchEvent: ");
            return super.onTouchEvent(event);
        }
    }
    public class MyLinearLayout extends LinearLayout {
        public MyLinearLayout(Context context) {
            super(context);
        }
    
        public MyLinearLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        //事件分发
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
            Log.d("lenve", "MyLinearLayout - dispatchTouchEvent: ");
            return super.dispatchTouchEvent(ev);
        }
    
        //事件拦截
        //1.返回值为false表示不拦截事件,事件继续向下分发给它的子控件
        //2.返回值为true表示拦截事件,拦截之后自己处理
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            boolean b = super.onInterceptTouchEvent(ev);
            Log.d("lenve", "MyLinearLayout - onInterceptTouchEvent: " + b);
            return b;
        }
    
        //事件处理
        //1.false表示该事件未处理,向上分发给它的父容器或者Activity
        //2.true表示该事件已处理,事件到此结束
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            boolean b = super.onTouchEvent(event);
            Log.d("lenve", "MyLinearLayout - onTouchEvent: " + b);
            return b;
        }
    }
    public class MyTextView extends TextView {
        public MyTextView(Context context) {
            super(context);
        }
    
        public MyTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyTextView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        @Override
        public boolean dispatchTouchEvent(MotionEvent event) {
            Log.d("lenve", "MyTextView - dispatchTouchEvent: ");
            return super.dispatchTouchEvent(event);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            Log.d("lenve", "MyTextView - onTouchEvent: ");
            return super.onTouchEvent(event);
        }
    }

    结果:

    //按下
    04-25 12:44:10.339 27977-27977/com.example.administrator.touchevent D/lenve: MainActivity - dispatchTouchEvent: 
    04-25 12:44:10.339 27977-27977/com.example.administrator.touchevent D/lenve: MyLinearLayout - dispatchTouchEvent: 
    04-25 12:44:10.339 27977-27977/com.example.administrator.touchevent D/lenve: MyLinearLayout - onInterceptTouchEvent: 
    04-25 12:44:10.339 27977-27977/com.example.administrator.touchevent D/levne: MyTestView - dispatchTouchEvent: 
    04-25 12:44:10.339 27977-27977/com.example.administrator.touchevent D/lenve: MyTestView - onTouchEvent: 
    04-25 12:44:10.339 27977-27977/com.example.administrator.touchevent D/lenve: MyLinearLayout - onTouchEvent: 
    04-25 12:44:10.339 27977-27977/com.example.administrator.touchevent D/lenve: MainActivity - onTouchEvent: 
    //松开
    04-25 12:44:11.103 27977-27977/com.example.administrator.touchevent D/lenve: MainActivity - dispatchTouchEvent: 
    04-25 12:44:11.103 27977-27977/com.example.administrator.touchevent D/lenve: MainActivity - onTouchEvent: 

    2.listview点击事件

    public class MainActivity extends AppCompatActivity {
    
        private List<String> list;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ListView listView = (ListView) findViewById(R.id.lv);
            initData();
            final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
            listView.setAdapter(adapter);
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Toast.makeText(MainActivity.this, list.get(position), Toast.LENGTH_SHORT).show();
                }
            });
            listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
                @Override
                public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                    list.remove(position);
                    adapter.notifyDataSetChanged();
                    return true;
                }
            });
        }
    
        private void initData() {
            list = new ArrayList<>();
            for (int i = 0; i < 30; i++) {
                list.add("李四:" + i);
            }
        }
    }

    注:按下后,setOnItemLongClickListener先执行,松开后,执行onItemClick。设置setOnItemLongClickListener返回true,松开后就不会执行onItemClick

    3.viewpager滑动

    viewPager.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            //让ViewPager的父容器不要拦截滑动事件
            viewPager.getParent().requestDisallowInterceptTouchEvent(true);
            //这里如果返回true则ViewPager的滑动事件会被屏蔽
            return false;
        }
    });

    结果:

    第一页的广告滑到最右边再滑不会切换到第二页

  • 相关阅读:
    C# winform 学习(一)
    C# winform 学习(一)
    C# winform 学习(二)
    C# winform 学习(二)
    C# Winform 学习(四)
    C# Winform 学习(四)
    C# winform 学习(三)
    gcc编译动态和静态链接库
    对深拷贝与浅拷贝的再次理解(默认构造函数是浅拷贝)
    QWaitCondition(和Java的Notify机制非常相像)
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/5430300.html
Copyright © 2011-2022 走看看