導航:首頁 > 操作系統 > android開發長按

android開發長按

發布時間:2024-07-10 19:45:01

『壹』 android框架 ImageButton如何實現 按住和松開時的事件

這個可以用onTouch來實現,touch事件有手指按下,移動,放開的相關api。

關於Touch事件的說明:

1.關於事件構成

在Android中,事件主要包括點按、長按、拖拽、滑動等,點按又包括單擊和雙擊,另外還包括單指操作和多指操作。所有這些都構成了Android中的事件響應。總的來說,所有的事件都由如下三個部分作為耐森基礎:

1.按下(ACTION_DOWN)

2.移動(ACTION_MOVE)

3.抬起(ACTION_UP)

所有的操作事件首先必須執行的是按下操作(ACTIONDOWN),之後所有的操作都是以按下操作作為前提,當按下操作完成後,接下來可能是一段移動(ACTIONMOVE)然後抬起(ACTION_UP),或者是按下操作執行完成後沒有移動就直接抬起。這一系列的動作在Android中都可以進行控制。


2.事件的處理API

在View和ViewGroup中都存在dispatchTouchEvent和onTouchEvent方法,但是在ViewGroup中還有一個onInterceptTouchEvent方法,在Android中,所有的事件都是從開始經過傳遞到完成事件的卜畝耐消費,這些方法的返回值就決定了某一事件是否是繼續往下傳,還是被攔截了,或是被消費了。

public boolean dispatchTouchEvent(MotionEvent event)
public boolean onTouchEvent(MotionEvent event)
public boolean onInterceptTouchEvent(MotionEvent event)


3.事件處理API的說明

  1. dispatchTouchEvent方法用於事件的分發,Android中所有的事件都必須經過這個方法的分發,然後型春決定是自身消費當前事件還是繼續往下分發給子控制項處理。返回true表示不繼續分發,事件沒有被消費。返回false則繼續往下分發,如果是ViewGroup則分發給onInterceptTouchEvent進行判斷是否攔截該事件。

  2. onTouchEvent方法用於事件的處理,返回true表示消費處理當前事件,返回false則不處理,交給子控制項進行繼續分發。

  3. onInterceptTouchEvent是ViewGroup中才有的方法,View中沒有,它的作用是負責事件的攔截,返回true的時候表示攔截當前事件,不繼續往下分發,交給自身的onTouchEvent進行處理。返回false則不攔截,繼續往下傳。

『貳』 Android騫沖彴楂樺痙API緇忛獙錛氶暱鎸夊湴鍥捐幏鍙栦綅緗淇℃伅

Android寮鍙戣繃紼嬩腑,鏈夊緢澶氭墜鍔挎搷浣滈兘寰堣╀漢鍙堢埍鍙堟仺銆備竴鏂歸潰鍙浠ユ洿渚挎嵎鐨勪綋鐜版洿澶氬姛鑳,鎻愬崌搴旂敤鐨勪綋楠,涓鏂歸潰綣佸嶅氬彉鐨勬搷浣滆儗鍚庢湁鐫璁稿氬紑鍙戞妧宸у拰闅鵑樸傝繖閲屽垎浜涓涓闀挎寜鍦板浘鑾峰彇浣嶇疆淇℃伅鐨勬墜鍔褲 涓轟簡鏇存槑浜,鍏堜笂涓灞曠ず鏁堟灉:闀挎寜鍦板浘鏌愮偣鏄劇ず璇ョ偣鍦扮悊浣嶇疆淇℃伅鍔熻兘 閫氳繃鏋勯犱竴涓猯ocationSelectOverlay綾繪潵瀹氫箟璇ュ姛鑳,鍦ㄥ湴鍥句笂瀵歸暱鎸夋墜鍔胯繘琛岀洃鍚,涓鏃︽湁榪欎釜浜嬩歡鍙戠敓灝辮皟鐢╣etAddressFromServer()鏂規硶鏉ユ樉紺哄湴鍧淇℃伅銆 鍦ㄨュ伐紼嬩腑鍒嗗埆瀹氫箟4涓綾籰ongPressMap.java,locationSelectOverlay.java,popUpPanel.java,Constants.java longPressMap.java涓烘樉紺轟竴涓鍦板浘綾,閫氳繃瀹炰緥鍖栦竴涓猯ocationSelectOverlay綾誨疄鐜伴暱鎸夊湴鍥炬樉紺哄湴鐞嗕綅緗淇℃伅鍔熻兘浠g爜濡備笅: //longPressMap 綾葷戶鎵縈apActivity瀵筸apview璧勬簮榪涜岀$悊 public class longPressMap extends MapActivity { private MapView mMapView; locationSelectOverlay mSelectLay; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //浣跨敤setContentView鏂規硶璋冪敤R.layout.activity_regeocoder甯冨矓鏂囦歡,鏄劇ず鍦板浘 setContentView(R.layout.geocoder); //鑾峰彇鍦板浘瑙嗗浘鐨剗d,璧嬪肩粰mMapView mMapView = ((MapView) findViewById(R.id.geocode_MapView)); // 璁劇疆鍚鐢ㄥ唴緗鐨勭緝鏀炬帶浠 mMapView.setBuiltInZoomControls(true); //瀹炰緥鍖栦竴涓猯ocationSelectOverlay綾 mSelectLay = new locationSelectOverlay(this, mMapView, new popUpPanel(this, mMapView)); //灝嗚ュ姛鑳藉姞杞藉埌姝ゅ湴鍥句笂,鍚鐢ㄩ暱鎸夊湴鍥炬樉紺鴻ョ偣鍦板潃淇℃伅鐨勫姛鑳 mMapView.getOverlays().add(mSelectLay); } } 澶嶅埗浠g爜 locationSelectOverlay紺轟緥浠g爜濡備笅: //locationSelectOverlay綾葷戶鎵縊verlay鎺ュ彛,瀹炵幇OnGestureListener鎵嬪娍鐩戝惉 public class locationSelectOverlay extends Overlay implements OnGestureListener { public popUpPanel mTipPanel;  //澹版槑涓涓寮瑰嚭妗嗗硅薄 GeoPoint mSelectPoint;    //澹版槑涓涓鍦扮悊鍧愭爣鐐瑰硅薄 MapView mMapView;    //澹版槑涓涓鍦板浘瑙嗗浘瀵硅薄 Context mContext;     //媧誨姩瀵硅薄 TextView mTipText=null;   //澹版槑涓涓鏂囨湰瀵硅薄 private static String nearbystr=""; private GestureDetector gestureScanner; //澹版槑涓涓鎵嬪娍鐩戝惉瀵硅薄 privateGeocoder coder;   //澹版槑涓涓閫嗗湴鐞嗙紪鐮佸硅薄 private String addressName="";   //澹版槑涓涓鍦板潃鍚嶇О瀛楃︿覆 //闀挎寜鍦板浘鏌愮偣鑾峰彇淇℃伅鐨勬瀯閫犲嚱鏁般 public locationSelectOverlay(Activity context,MapView mapView,popUpPanel panel) { this.mContext=context; this.mMapView=mapView; this.mTipPanel=panel; gestureScanner = new GestureDetector(this); //澹版槑涓涓鎵嬪娍鐩戝惉瀵硅薄 coder = new Geocoder(context);   //澹版槑涓涓閫嗗湴鐞嗙紪鐮佸硅薄 } //鐢℉andler鍑芥暟澶勭悊浼犻掓潵鐨勫湴鍧淇℃伅,鏄劇ず鍦ㄦ枃鏈妗嗕腑 private Handler mGeocoderHandler = new Handler() { public void handleMessage(Message msg) { //濡傛灉鏈夊湴鍧淇℃伅鐨勬秷鎮鍙戦佽繃鏉,灝嗘枃鏈妗嗕腑璁劇疆涓鴻ュ湴鍧淇℃伅 if(msg.what == Constants.REOCODER_RESULT) { if(mTipText!=null) mTipText.setText(addressName); } //濡傛灉鏄劇ず閿欒,鍒欐枃鏈妗嗕腑璁劇疆鎶ラ敊淇℃伅 else if(msg.what == Constants.ERROR) { Toast.makeText(mContext, "鑾峰彇鍦板潃澶辮觸,璇烽噸璇", Toast.LENGTH_SHORT).show(); removeTipPanel(); } } }; //鏄劇ず寮瑰嚭紿楀彛 public boolean showTap(GeoPoint p) { View view = mTipPanel.getView(); mMapView.removeView(view); //甯冨矓鍙傛暟璁劇疆 MapView.LayoutParams geoLP = new MapView.LayoutParams( MapView.LayoutParams.WRAP_CONTENT, MapView.LayoutParams.WRAP_CONTENT, p, MapView.LayoutParams.BOTTOM_CENTER); //寮瑰嚭紿楀彛鐨勬枃鏈鏄劇ず mTipText = (TextView) view.findViewById(R.id.GeoName); mTipText.setText("姝e湪鍔犺澆鍦板潃..."); mTipText.setOnClickListener(new OnClickListener() { public void onClick(View v) { } }); //鍦ㄥ湴鍥捐嗗浘涓婃坊鍔犺ュ脊鍑虹獥鍙h嗗浘 mMapView.addView(view, geoLP); return false; } //浠庣粡綰搴﹀潗鏍囩偣鑾峰彇瀵瑰簲鐨勫湴鍧淇℃伅 publicvoid getAddressFromServer(final GeoPoint point,final Handler handler) { //澹版槑涓涓綰跨▼ new Thread(){ public void run() { try { // 閫嗗湴鐞嗙紪鐮乬etFromLocation()鍑芥暟鑾峰彇璇ョ偣瀵瑰簲鐨勫墠3涓鍦板潃淇℃伅 ListAddress address = coder.getFromLocation((double)point.getLatitudeE6()/1E6, (double)point.getLongitudeE6()/1E6, 3); if (address != null) { //鑾峰彇絎涓涓鍦板潃淇℃伅 Address addres = address.get(0); addressName = ""; if(addres.getAdminArea()!=null) addressName+=addres.getAdminArea(); if(addres.getSubLocality()!=null) addressName += addres.getSubLocality(); if(addres.getFeatureName()!=null) addressName += addres.getFeatureName(); addressName += "闄勮繎"; handler.sendMessage(Message .obtain(handler, Constants.REOCODER_RESULT)); } } catch (AMapException e) { // TODO Auto-generated catch block handler.sendMessage(Message .obtain(handler, Constants.ERROR)); } } }.start(); //綰跨▼鍚鍔 } //縐昏蛋寮瑰嚭紿楀彛 public void removeTipPanel() { View view = mTipPanel.getView(); mMapView.removeView(view); } //鑾峰彇鎵嬪娍鎿嶄綔 public boolean onTouchEvent(MotionEvent event, MapView mapView) { return gestureScanner.onTouchEvent(event); } @Override public boolean onDown(MotionEvent e) { // TODO Auto-generated method stub return false; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { // TODO Auto-generated method stub return false; } //闀挎寜鍦板浘,寮瑰嚭鎻愮ず妗,鏄劇ず璇ョ偣鍦板潃淇℃伅 @Override public void onLongPress(MotionEvent e) { // TODO Auto-generated method stub int x = (int)e.getX(); int y = (int)e.getY(); mSelectPoint = mMapView.getProjection().fromPixels(x, y); //璋冪敤鏄劇ず鎻愮ず妗嗗嚱鏁 showTap(mSelectPoint); //璋冪敤浠庣粡綰搴︾偣鑾峰彇鍦板潃淇℃伅鍑芥暟 getAddressFromServer(mSelectPoint,mGeocoderHandler); } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // TODO Auto-generated method stub return false; } 澶嶅埗浠g爜 pouUpPanel瀹氫箟浜嗗脊鍑虹獥鍙g被 public class popUpPanel { private boolean isVisible = false; private MapView mMapView; private View popup; public popUpPanel(Activity paramActivity, MapView paramMapView) { this.mMapView = paramMapView; ViewGroup localViewGroup = (ViewGroup)this.mMapView.getParent(); //璁劇疆寮瑰嚭鐨勮嗗浘鏄痠d涓篟.layout.activity_long_press_map鐨勮嗗浘 this.popup = paramActivity.getLayoutInflater().inflate(R.layout.activity_long_press_map, localViewGroup, false); 鈥 澶嶅埗浠g爜 Constants 瀹氫箟浜嗕紶閫掔殑甯擱噺瀵瑰簲鐨勫礆紝濡俻ublic static finalint REOCODER_RESULT=3000; 琛ㄧず閫嗗湴鐞嗙紪鐮佺粨鏋滃父閲忥紝public staticfinal int ERROR=1001; 琛ㄧず鍑虹幇閿欒甯擱噺銆

『叄』 【Android開發】如何 使得 android長按按鈕=多次按下按鈕

項目遇到需要實現按鍵點擊同時,如果按住也能實現連續音量加的效果

本辦法是通過按下標志開啟線程固定間隔時間發送動作

重寫setOnTouchListener事件

  1. btn_bolumeup.setOnTouchListener(newOnTouchListener(){

  2. @Override
  3. publicbooleanonTouch(Viewv,MotionEventevent)
  4. {
  5. Log.d("yj.chen","onTouch");
  6. if(event.getAction()==MotionEvent.ACTION_DOWN){
  7. Log.d("yj.chen","ACTION_DOWN");
  8. longClicked=true;
  9. btn_bolumeup.setBackgroundResource(R.drawable.haier_pop_btn_nor_m);//
  10. Threadt=newThread(){
  11. @Override
  12. publicvoidrun(){
  13. super.run();
  14. while(longClicked)
  15. {
  16. sendcode=24;
  17. sendkeyenvet();
  18. try{
  19. Thread.sleep(250);
  20. }catch(InterruptedExceptione){
  21. e.printStackTrace();
  22. }
  23. Log.d("yj.chen","runend");
  24. }
  25. }
  26. };
  27. t.start();
  28. }elseif(event.getAction()==MotionEvent.ACTION_UP){
  29. btn_bolumeup.setBackgroundResource(R.drawable.touch_control_btn);//touch_control_btnhaier_pop_btn_sel_m
  30. longClicked=false;
  31. Log.d("yj.chen","ACTION_UP");
  32. }
  33. returntrue;
  34. }
  35. });

『肆』 長按如何使進度條變化Android

通過MediaPlayer調節。
系統自帶的進度條的顏色比較單調,實際開發中使用較少,可以自定義進度條背景,新建一個progressbarbg.xml文件。gradient可以設置進度條的漸變色,android:endColor和android:startColor可以設置漸變開始和結束的顏色。定義完成以後,便可以使用。
在音樂進度,網路下載時,需動態載入進度條,默認情況下,設置進度條,使用setProgress即可。但有時除了動態設置進度,仍需要動態設置進度條顏色通過MediaPlayer播放音樂並獲取進度,設置進度。

『伍』 android 編程 按住 按一下 松開 分別如何監聽

樓主亂攔寬是想表衡游達,「長按」時間的監聽嗎嘩亮?那麼:

down.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
// TODO Auto-generated method stubreturntrue;
}
});

望樓主採納!

閱讀全文

與android開發長按相關的資料

熱點內容
應用加密機和可信平台 瀏覽:991
linuxusb禁用 瀏覽:722
宿州市電信dns伺服器地址是多少 瀏覽:83
數字簽名中報文加密方式 瀏覽:481
解壓包變成記事本格式了 瀏覽:285
安卓編程怎麼復制文本 瀏覽:818
雲開通伺服器 瀏覽:387
python編程集合降序 瀏覽:281
山西抖音小程序源碼 瀏覽:698
方舟編譯器到底什麼原理 瀏覽:641
演算法概率與人工干預 瀏覽:671
軟通動力android 瀏覽:18
linuxwireshark命令 瀏覽:195
php播放器插件 瀏覽:950
如何把python寫的程序導入手機 瀏覽:25
mysql中查詢系統變數的命令是什麼 瀏覽:142
尚恩解壓圖片 瀏覽:554
新手程序員學那個語言接私活 瀏覽:19
疏解壓力同義詞 瀏覽:79
如何使用阿里雲網路伺服器 瀏覽:102