布局文件
<?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更新到布局管理器中 }