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;
        }
    });

    结果:

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

  • 相关阅读:
    hive与hbase整合
    待重写
    hive DML
    【知识强化】第六章 总线 6.1 总线概述
    【知识强化】第五章 中央处理器 5.1 CPU的功能和基本结构
    【知识强化】第四章 指令系统 4.3 CISC和RISC的基本概念
    【知识强化】第四章 指令系统 4.2 指令寻址方式
    【知识强化】第四章 指令系统 4.1 指令格式
    【知识强化】第三章 存储系统 3.6 高速缓冲存储器
    【知识强化】第三章 存储系统 3.5 双口RAM和多模块存储器
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/5430300.html
Copyright © 2011-2022 走看看