android長按事件
❶ 求android自定義控制項怎麼添加點擊事件,長按事件
一般的控制項只要是繼承了View 都可以添加這兩個事件,只需要重寫View的setOnClicklistener和setOnLongClickListener這兩個函數就可以了。
添加這兩個函數,別人就能用set方法給你傳進來listener,而你可以在onTouch方法里通過判斷aciton_down action_move action_up 通過時間來判斷是長按還是單擊。
❷ Android 如何判斷屏幕長按,
Android系統自帶了長按事件,setOnLongClickListener即可監聽。也可以自己定義(不用系統的長按事件),比如當希望長按的時間更長一點的時候。這時候就需要自己來定義這個長按事件了。
❸ android百度地圖 手機屏幕長按事件 怎麼實現
剛好今天也遇到這個問題,二逼網路地圖api
你會發現一個規律,長按事件並不會改變 地圖放大級別,而通過手勢放大雖然也會觸發長按事件而且沒法區分是單點觸控還是多點觸控,但是可以發現手勢放大或者縮小會改變地圖的放大級別
在api裡面就是這個值int old_zoom = mMapView.getZoomLevel();
在ontouch事件裡面這樣處理
MotionEvent.ACTION_DOWN時候獲取地圖的放大級別,記下這個值,在public void onLongPress(MotionEvent e) 方法里在把調用 獲取地圖放大級別的
int now_zoom=mMapView.getZoomLevel();
if(old_zoom==now_zoom){
//此時是長按事件
}else{
//手勢放大縮小事件
}
❹ android 中怎麼監聽按鍵的長按事件
長按事件一般是放到 onKeyLongPress 函數中來處理的。
那具體是怎麼做的呢,下面請看步驟:
先在 onKeyDown 函數中判斷 event.getRepeatCount 的次數(實際上長按就是由一系列的onKeyDown事件觸發的)
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
case KeyEvent.KEYCODE_VOLUME_DOWN:
case KeyEvent.KEYCODE_VOLUME_UP:
if (mCameraAppView.getVisibility() != View.VISIBLE) {
return false;
}
Log.v(TAG,"onKeyDown event.getRepeatCount() "+event.getRepeatCount());
if (event.getRepeatCount() == 0) {
event.startTracking();
return true;
}
return true;
}
return super.onKeyDown(keyCode, event);
}
❺ Android開發中,長按事件怎麼獲得屏幕坐標點
對於很多游戲使用屏幕控制一般需要考慮長按事件,比如在動作類的游戲中需要長按發射武器,結合Android Button模型,我們實現一個帶圖片的Button的長按,為了更清晰的顯示原理,Android開發網這里使用ImageButton作為基類.
public class RepeatingImageButton extends ImageButton {
private long mStartTime; //記錄長按開始
private int mRepeatCount; //重復次數計數
private RepeatListener mListener;
private long mInterval = 500; //Timer觸發間隔,即每0.5秒算一次按下
public RepeatingImageButton(Context context) {
this(context, null);
}
public RepeatingImageButton(Context context, AttributeSet attrs) {
this(context, attrs, android.R.attr.imageButtonStyle);
}
public RepeatingImageButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setFocusable(true); //允許獲得焦點
setLongClickable(true); //啟用長按事件
}
public void setRepeatListener(RepeatListener l, long interval) { //實現重復按下事件listener
mListener = l;
mInterval = interval;
}
@Override
public boolean performLongClick() {
mStartTime = SystemClock.elapsedRealtime();
mRepeatCount = 0;
post(mRepeater);
return true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) { // 本方法原理同onKeyUp的一樣,這里處理屏幕事件,下面的onKeyUp處理Android手機上的物理按鍵事件
removeCallbacks(mRepeater);
if (mStartTime != 0) {
doRepeat(true);
mStartTime = 0;
}
}
return super.onTouchEvent(event);
}
//處理導航鍵事件的中鍵或軌跡球按下事件
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_ENTER:
super.onKeyDown(keyCode, event);
return true;
}
return super.onKeyDown(keyCode, event);
}
//當按鍵彈起通知長按結束
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_ENTER:
removeCallbacks(mRepeater); //取消重復listener捕獲
if (mStartTime != 0) {
doRepeat(true); //如果長按事件累計時間不為0則說明長按了
mStartTime = 0; //重置長按計時器
}
}
return super.onKeyUp(keyCode, event);
}
private Runnable mRepeater = new Runnable() { //在線程中判斷重復
public void run() {
doRepeat(false);
if (isPressed()) {
postDelayed(this, mInterval); //計算長按後延遲下一次累加
}
}
};
private void doRepeat(boolean last) {
long now = SystemClock.elapsedRealtime();
if (mListener != null) {
mListener.onRepeat(this, now - mStartTime, last ? -1 : mRepeatCount++);
}
}
下面是重復Button Listener介面的定義,調用時在Button中先使用setRepeatListener()方法實現RepeatListener介面
public interface RepeatListener {
void onRepeat(View v, long ration, int repeatcount); //參數一為用戶傳入的Button對象,參數二為延遲的毫秒數,第三位重復次數回調。
}
}
本類大家可以直接在自己的View中implements實現RepeatListener介面即可.
❻ android 中怎麼監聽按鍵的長按事件
長按事件一般是放到 onKeyLongPress 函數中來處理的。
那具體是怎麼做的呢,下面請看步驟:
第一步,先在 onKeyDown 函數中判斷 event.getRepeatCount 的次數(實際上長按就是由一系列的onKeyDown事件觸發的)
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
case KeyEvent.KEYCODE_VOLUME_DOWN:
case KeyEvent.KEYCODE_VOLUME_UP:
if (mCameraAppView.getVisibility() != View.VISIBLE) {
return false;
}
Log.v(TAG,"onKeyDown event.getRepeatCount() "+event.getRepeatCount());
if (event.getRepeatCount() == 0) {
event.startTracking();
return true;
}
return true;
}
return super.onKeyDown(keyCode, event);
}
如果一直按著不放,通過打 log 可以看到
onKeyDown event.getRepeatCount() 0
onKeyDown event.getRepeatCount() 1
onKeyDown event.getRepeatCount() 2
onKeyDown event.getRepeatCount() 3
onKeyDown event.getRepeatCount() 4
onKeyDown event.getRepeatCount() 5
onKeyDown event.getRepeatCount() 6
onKeyDown event.getRepeatCount() 7
onKeyDown event.getRepeatCount() 8
onKeyDown event.getRepeatCount() 9
onKeyDown event.getRepeatCount() 10
onKeyDown event.getRepeatCount() 11
onKeyDown event.getRepeatCount() 12
……
第二步,重載 onKeyLongPressed 函數,在這個函數中你可以添加你的處理
@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
Log.v(TAG,"key long pressed keyCode = "+keyCode);
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_UP:
case KeyEvent.KEYCODE_VOLUME_DOWN:
Log.v(TAG,"KEYCODE_VOLUME_UP/DOWN long pressed");
lockLongPressKey = true;
onShutterButtonLongPressed();
return true;
default:
break;
}
return super.onKeyLongPress(keyCode, event);
}
第三步,如果在onKeyUp 函數中也處理了相同的按鍵的話,那麼需要對 onKeyLongPress 和 onKeyUp 中該按鍵的處理作互斥處理了
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_UP:
case KeyEvent.KEYCODE_VOLUME_DOWN:
Log.v(TAG, "onKeyUp event.getRepeatCount() "+event.getRepeatCount());
if(lockLongPressKey){
lockLongPressKey = false;
return true;
}
if (event.getRepeatCount() == 0) {
Log.v(TAG, "prepare for onShutterButtonClick..");
if (mEnableRecordBtn && mReviewImage.getVisibility() != View.VISIBLE
&& mBgLearningMessageFrame.getVisibility() == View.GONE) {
if (mShutterButton != null && mShutterButton.isEnabled()) {
onShutterButtonFocus(false);
collapseCameraControls();//fulin@20121101@fix PD1218 B121027-224
onShutterButtonClick();
}
}
}
if (mCameraAppView.getVisibility() != View.VISIBLE) {
return false;
}
return true;
}
return super.onKeyUp(keyCode, event);
}
互斥處理的原因是,長按事件處理完後,松開按鍵後就會執行 onKeyUp 函數。而這兩處針對相同的按鍵想要實現的功能又不一樣
固在此添加一個 private boolean lockLongPressKey = false; 變數,在 onKeyLongPress 函數中處理過以後,在 onKeyUp中便不再處理。
2, button
自定義的 button 長按事件則是通過實現 OnLongClickListener 介面來做到的。
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnLongClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MyActivity extends Activity implements OnLongClickListener{
Button button;//聲明按鈕的引用
public void onCreate(Bundle savedInstanceState) {//重寫的onCreate方法
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button = (Button) this.findViewById(R.id.button);//得到按鈕的引用
button.setTextSize(20);
button.setOnLongClickListener(this);//注冊監聽
}
public boolean onLongClick(View v) {//實現介面中的方法
if(v == button){//當按下的是按鈕時
Toast.makeText(
this,
"長時間按下了按鈕",
Toast.LENGTH_SHORT
).show();//顯示提示
}
return false;
}
}
❼ 怎樣取消長按監聽事件 android
1,key -- 實體按鍵,
現在手機物理按鍵越來越少
常見的有 KEYCODE_VOLUME_DOWN/UP KEYCODE_POWER KEYCODE_BACK KEYCODE_HOME KEYCODE_MENU
在一個activity 重載父類 的下面這三個方法來處理按鍵事件
public boolean onKeyDown(int keyCode, KeyEvent event)
public boolean onKeyUp(int keyCode, KeyEvent event)
public boolean onKeyLongPress(int keyCode, KeyEvent event)
很明顯,長按事件一般是放到 onKeyLongPress 函數中來處理的。
❽ Android 怎麼設置Gallery長按事件
gallery.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
//寫操作代碼
return false;
}
});
❾ android 中怎麼監聽按鍵的長按事件
現在手機物理按鍵越來越少
常見的有 KEYCODE_VOLUME_DOWN/UP KEYCODE_POWER KEYCODE_BACK KEYCODE_HOME KEYCODE_MENU
在一個activity 重載父類 的下面這三個方法來處理按鍵事件
public boolean onKeyDown(int keyCode, KeyEvent event)
public boolean onKeyUp(int keyCode, KeyEvent event)
public boolean onKeyLongPress(int keyCode, KeyEvent event)
很明顯,長按事件一般是放到 onKeyLongPress 函數中來處理的。