zoukankan      html  css  js  c++  java
  • Android基础——物理按键,长按,触摸事件及其监听器,触摸和单击的区别

    布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/relationLayout"
        tools:context=".MainActivity">
    
        <ImageButton
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="长按按钮"
            />
    
    
    </RelativeLayout>

    java代码:长按这块还有点问题

    package com.example.myeventi;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.ContextMenu;
    import android.view.KeyEvent;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageButton;
    import android.widget.RelativeLayout;
    import android.widget.Toast;
    
    public class MainActivity extends Activity{
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //2.2:把长按事件注册到菜单中,并打开菜单,在onCreate中执行
            ImageButton button1 = (ImageButton)findViewById(R.id.button1);
            button1.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    registerForContextMenu(v);//把长按事件注册到ContextMenu中
                    openContextMenu(v);//打开菜单
                    return false;
                }
            });
    
            //3.2:创建并实例化TouchView类的对象,并为TouchView添加触摸事件监听器,
            //      在重写的方法中根据触摸的位置重绘TouchView
            final TouchView touchView = new TouchView(MainActivity.this);
            touchView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    touchView.bitmapX = event.getX()-80;//设定坐标;
                    touchView.bitmapY = event.getY()-80;
                    touchView.invalidate();//重新绘制
                    return true;
                }
            });
            //3.3:把TouchView更新到布局管理器中
            RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.relationLayout);
            relativeLayout.addView(touchView);
    
    
            /*
             * 4:单击和触摸的区别
             *  和触摸监听器返回值有关:
             *      false:不会消耗掉这次事件,该点击的继续点击
             *      true:会消耗掉这次事件
             * */
            //4.1:添加单击按钮的监听器
             Button button2 = (Button)findViewById(R.id.button2);
             button2.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
                     Log.i("onClick","单击事件");
                 }
             });
             button2.setOnTouchListener(new View.OnTouchListener() {
                 @Override
                 public boolean onTouch(View v, MotionEvent event) {
                     if(event.getAction()==MotionEvent.ACTION_DOWN){//手指向下
                         Log.i("onTouch","按下");
                     }
                     if(event.getAction()==MotionEvent.ACTION_UP){//手指抬起
                        Log.i("onTouch","抬起");
                     }
                     return false;
                 }
             });
        }
    
        /*
        1:基本按钮连续按两次返回键退出应用
        */
        private static long lastTime = 0;
        //1.1:重写onKeyDown()方法拦截用户单击后退按钮事件
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if(keyCode == KeyEvent.KEYCODE_BACK){
                exit();
                return true;
            }
            return super.onKeyDown(keyCode, event);
        }
        //1.2:创建退出方法exit(),需要判断两次按下返回键的时间差
        public void exit(){
            if(System.currentTimeMillis()-lastTime > 2000){//只按了一次
                Toast.makeText(
                        MainActivity.this,"再按一次退出程序",Toast.LENGTH_SHORT
                ).show();
                lastTime = System.currentTimeMillis();
            }
            else {//连按两次就退出
                finish();
                System.exit(0);
            }
        }
    
        /*
        * 2:长按事件监听器
        * */
        //2.1:在MainActivity中重写onCreateContextMenu菜单,为菜单添加选项值
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
            super.onCreateContextMenu(menu, v, menuInfo);
            menu.add("收藏");
            menu.add("举报");
        }
        //2.2:把长按事件注册到菜单中,并打开菜单,在onCreate中执行
    
        /*
        * 3.触摸事件监听器
        * */
        //3.1:新建TouchView类呈现触摸所在地的图像
        //3.2:创建并实例化TouchView类的对象,并为TouchView添加触摸事件监听器,
        //      在重写的方法中根据触摸的位置重绘TouchView
        //3.3:把TouchView更新到布局管理器中
    
    
    
    }
  • 相关阅读:
    19.模块化
    20.ES7新特性
    22.ES9
    21.ES8新特性
    RabbitMQ:排他性队列(Exclusive Queue)
    为什么要使用消息队列
    收集RabbitMQ的用户
    身份管理提供商:Gigya和PingIdentity
    HTTP协议原理(详细)
    转:Linux下高并发socket最大连接数所受的各种限制
  • 原文地址:https://www.cnblogs.com/zsben991126/p/12238670.html
Copyright © 2011-2022 走看看