android手機(jī)長按home鍵能起作用的作用有以下幾類:
公司主營業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、外貿(mào)營銷網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出龍山免費(fèi)做網(wǎng)站回饋大家。
Home鍵可以說是我們每天使用最多的功能之一,一般我們使用這個(gè)按鍵多數(shù)是用于返回主頁或調(diào)出語音助手等等。
各個(gè)版本的安卓,常按home鍵,屏幕會出現(xiàn)最近是用過的app程序圖標(biāo)。
對于安卓4.1來說,則更加明細(xì),即不僅會出現(xiàn)最近用過的aop還會出現(xiàn),正在后臺運(yùn)行的程序,一個(gè)簡單的小窗口即可迅速切換到后臺程序。
簡單的理解就是,手機(jī)home鍵就是菜單鍵和主鍵。
android 底層在當(dāng)你點(diǎn)擊控件2秒后就屬于長按事件了,則進(jìn)入長按事件監(jiān)聽,當(dāng)點(diǎn)擊少于2秒就直接進(jìn)入點(diǎn)擊事件了,望有幫助
下面記錄一個(gè)在工作中,遇到的touchend事件不觸發(fā)的bug解決方法:
就是當(dāng)長按特定按鈕的時(shí)候,會啟動(dòng)一個(gè)事件,往杯子里面裝水,當(dāng)松開后,會有相關(guān)的操作,但是發(fā)現(xiàn)在部分安卓手機(jī)里面,長按松手后,touchend事件觸發(fā)不了。一開始在網(wǎng)上找了好多回復(fù),都說在touchstart事件里面加上e.preventDefault()就可以啦,但是經(jīng)過親身試驗(yàn)后,發(fā)現(xiàn)此方法對長按事件無效!
后來只能查看了一下touch其他的事件,發(fā)現(xiàn)還有 touchcancel 這么一個(gè)東西!
這個(gè)事件是在,當(dāng)觸控點(diǎn)被特定的實(shí)現(xiàn)方式打亂時(shí)觸發(fā) 的,于是就懷著死馬當(dāng)活馬醫(yī)的心情,在頁面添加了touchcancel事件,里面執(zhí)行的邏輯和touchend事件里面的邏輯是一模一樣的,結(jié)果還真是不讓人失望,完美解決!
首先,支持長按和點(diǎn)擊的視圖一定是從Down開始就消費(fèi)事件,在不設(shè)置Touch監(jiān)聽器OnTouchListener的情況下,每個(gè)事件都會進(jìn)入onTouchEvent方法。
當(dāng)一個(gè)視圖設(shè)置了長按監(jiān)聽器,在Flag中會增加LONG_CLICKABLE標(biāo)志。View內(nèi)部靜態(tài)類ListenerInfo集合了與View相關(guān)的各類監(jiān)聽。
Down事件時(shí),會調(diào)用一個(gè)checkForLongClick方法,向主線程延遲發(fā)送一個(gè)Runnable。
延遲時(shí)間即系統(tǒng)認(rèn)為多久算長按事件的時(shí)間,如果期間手指一直在觸屏,當(dāng)?shù)竭_(dá)該時(shí)間時(shí),主線程調(diào)度該任務(wù),run方法,將觸發(fā)performLongClick方法,系統(tǒng)認(rèn)為這是一次長按事件。
手指還在觸摸時(shí),就會調(diào)用長按監(jiān)聽器的onLongClick方法,如果未達(dá)到時(shí)間,手指已經(jīng)離開屏幕,Up事件,此時(shí),如果還沒有執(zhí)行過Runnable,將會調(diào)用removeCallbacks方法移除該任務(wù),確保手指離開后不會再觸發(fā)長按Runnable,同時(shí),執(zhí)行performClick方法,系統(tǒng)認(rèn)為這是一次點(diǎn)擊事件。
任重而道遠(yuǎn)
IOS與安卓的區(qū)別:
1、兩者運(yùn)行機(jī)制不同:IOS采用的是沙盒運(yùn)行機(jī)制,安卓采用的是虛擬機(jī)運(yùn)行機(jī)制。
2、兩者后臺制度不同:IOS中任何第三方程序都不能在后臺運(yùn)行;安卓中任何程序都能在后臺運(yùn)行,直到?jīng)]有內(nèi)存才會關(guān)閉。
3、IOS中用于UI指令權(quán)限最高,安卓中 數(shù)據(jù)處理 指令權(quán)限最高
iOS只有一個(gè)物理鍵,android有三個(gè)物理鍵
2 iOS和android的底層交互設(shè)計(jì)不同
1、返回的入口不一致,android基本上是硬件返回,iphone則是屏幕軟鍵返回。但這點(diǎn)很可能隨著Android4.0的出現(xiàn)而改變;
2、長按為android的一個(gè)基本的標(biāo)配操作,但iOS應(yīng)盡量避免;這點(diǎn)造成了很多操作上的不一樣,例如刪除操作,iOS為滑動(dòng),android為長按
3、Android有menu鍵,點(diǎn)擊后調(diào)出menu菜單,iOS沒有;
4、tab的處理上也不一致,因?yàn)閕Phone沒有menu菜單,更多的操作很可能放在最后一個(gè)tab里,叫“more”;
5、應(yīng)用的通知處理也不一致,iOS為圖標(biāo)右上角的小紅圈,Android為statuesbar中的滾動(dòng)顯示;
6、iPhone有子tab,android好像還沒有看到有,除非是第三方應(yīng)用自己添加的控件。
2.操作欄
a )安卓操作或tab均放上方,以免與虛擬鍵盤沖突,而非ios的下方,但許多安卓應(yīng)用也按ios的來設(shè)計(jì),因此這個(gè)點(diǎn)的設(shè)計(jì)更改可以酌情考量; iPhone 5c, 任何時(shí)候從屏幕下方可以拉出“控制中心”,Android 是從上方拉出了
只說一點(diǎn),滑動(dòng)屏幕的感受,iOS是最順暢最自然的。在商場里體驗(yàn)過很多android,滑動(dòng)的感受總有那么點(diǎn)怪怪的,或者說有點(diǎn)生硬,低配置的還有卡頓等現(xiàn)象。
OS 用導(dǎo)航欄左上角的返回鈕,android 用戶習(xí)慣按全局 back 鍵。
Android 見啥都想長按;iOS用戶則非常不習(xí)慣,只會點(diǎn)來點(diǎn)去。
iOS上面捏合手勢是標(biāo)配;Android 上不是跑太快就卡的狠要么沒反應(yīng),總之各種難過少人用。
Android 下邊緣有軟鍵,交互元素要離遠(yuǎn)點(diǎn)
2.iOS 雙擊home鍵的界面完全更改,改成卡片式預(yù)覽。如果覺得撥動(dòng)app縮略圖行進(jìn)過慢可以撥動(dòng)下方的app圖標(biāo),會稍微快一點(diǎn)。向上推app縮略圖來關(guān)閉app。
Android,在主界面,按左鍵 ,可以預(yù)覽所以打開的應(yīng)用,向上推 可關(guān)閉app
在短信中,向左稍稍拉動(dòng)可以顯示每條短信的具體收發(fā)時(shí)間。
長按事件一般是放到 onKeyLongPress 函數(shù)中來處理的。
那具體是怎么做的呢,下面請看步驟:
第一步,先在 onKeyDown 函數(shù)中判斷 event.getRepeatCount 的次數(shù)(實(shí)際上長按就是由一系列的onKeyDown事件觸發(fā)的)
@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 函數(shù),在這個(gè)函數(shù)中你可以添加你的處理
@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 函數(shù)中也處理了相同的按鍵的話,那么需要對 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);
}
互斥處理的原因是,長按事件處理完后,松開按鍵后就會執(zhí)行 onKeyUp 函數(shù)。而這兩處針對相同的按鍵想要實(shí)現(xiàn)的功能又不一樣
固在此添加一個(gè) private boolean lockLongPressKey = false; 變量,在 onKeyLongPress 函數(shù)中處理過以后,在 onKeyUp中便不再處理。
2, button
自定義的 button 長按事件則是通過實(shí)現(xiàn) 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);//注冊監(jiān)聽
}
public boolean onLongClick(View v) {//實(shí)現(xiàn)接口中的方法
if(v == button){//當(dāng)按下的是按鈕時(shí)
Toast.makeText(
this,
"長時(shí)間按下了按鈕",
Toast.LENGTH_SHORT
).show();//顯示提示
}
return false;
}
}