編輯:關於Android編程
這幾天遇到點關於Android的觸摸事件相關的,還跟onClick有關,暫且記下:
LinearLayout分別設置了onTouchListener,onClickListener,onLongClickListener及onTouchEvent回調
1、在屏幕上觸摸之後基本的執行流程如下:
onTouch,action=0
onTouchEvent,action=0
onTouch,action=2
onTouchEvent,action=2
onTouch,action=2
onTouchEvent,action=2
onTouch,action=1
onTouchEvent,action=1
onClick
也就是先說onTouchListener是最先被觸發的,然後是本身的onTouchEvent回調;當最後的up事件發生並被onTouchEvent處理後才會觸發onClickListener。
2、把onTouchEvent回調中的super.onTouchEvent去除,直接返回true;則流程如下:
onTouch,action=0
onTouchEvent,action=0
onTouch,action=2
onTouchEvent,action=2
onTouch,action=2
onTouchEvent,action=2
onTouch,action=1
onTouchEvent,action=1
可以看到onClickListener永遠無法被觸發,也側面說明了對onClick的觸發是在onTouchEvent回調中來實現的。
3、長按屏幕,流程如下:
onTouch,action=0
onTouchEvent,action=0
onTouch,action=2
onTouchEvent,action=2
onTouch,action=2
onTouchEvent,action=2
onLongClick
onTouch,action=2
onTouchEvent,action=2
onTouch,action=2
onTouchEvent,action=2
onTouch,action=1
onTouchEvent,action=1
onClick
當長按的時候,無需到up就會觸發onLongClick的響應,但之後也會繼續觸發onClick的響應。
4、但如果在onLongClick中返回true,則流程如下,即只在中間觸發了onLongClick,之後會繼續響應touch,但當up的時候就不會再觸發onClick
onTouch,action=0
onTouchEvent,action=0
onTouch,action=2
onTouchEvent,action=2
onTouch,action=2
onTouchEvent,action=2
onLongClick
onTouch,action=2
onTouchEvent,action=2
onTouch,action=2
onTouchEvent,action=2
onTouch,action=1
onTouchEvent,action=1
測試代碼如下:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FrameLayout frame = (FrameLayout)findViewById(R.id.container); LinearLayoutTest line = new LinearLayoutTest(this); line.setOnClickListener(new ClickListener()); line.setOnLongClickListener(new LongClickListener()); line.setOnTouchListener(new TouchListener()); line.setLongClickable(true); frame.addView(line); } public class ClickListener implements OnClickListener { @Override public void onClick(View v) { Log.e("test","onClick"); } } public class LongClickListener implements OnLongClickListener{ @Override public boolean onLongClick(View v) { Log.e("test","onLongClick"); return true; } } public class TouchListener implements OnTouchListener{ @Override public boolean onTouch(View v, MotionEvent event) { Log.e("test","onTouch,action="+event.getAction()); return false; } } }
public class LinearLayoutTest extends LinearLayout{ public LinearLayoutTest(Context context) { super(context); } @Override public boolean onTouchEvent(MotionEvent event) { Log.e("test","onTouchEvent,action="+event.getAction()); return super.onTouchEvent(event); } }
簡介 在Android中運用了很多機制,例如:廣播、服務、數據庫、通知、包……等等。什麼是廣播?Broadcast是一種廣泛運用的在應用程序之間傳輸
Android React Native 已經將幾個常用的原生組件進行了封裝,比如 ScrollView 和 TextInput,但是並不是所有系統的原始組件都被封裝了,
先來看看要實現的效果圖:對於安卓用戶來說,手機應用市場說滿天飛可是一點都不誇張,比如小米,魅族,百度,360,機鋒,應用寶等等,當我們想上線一款新版本APP時,先不說渠道
先上圖:這裡以添加 afinal_0.5.1_bin.jar 為例。第一步:添加jar包到libs裡面,系統自動把jar加載到android private librar