最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android TouchListener實(shí)現(xiàn)拖拽刪實(shí)例代碼

 更新時(shí)間:2017年02月13日 16:00:50   投稿:lqh  
這篇文章主要介紹了Android TouchListener實(shí)現(xiàn)拖拽刪實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下

Android TouchListener實(shí)現(xiàn)拖拽刪實(shí)例代碼

如果為一個(gè)控件設(shè)置了該觸摸監(jiān)聽(tīng), 控件會(huì)隨著用戶的拖動(dòng)而移動(dòng), 如果拖動(dòng)的距離大過(guò)設(shè)置的臨界值, 那么當(dāng)松開(kāi)手指時(shí)會(huì)有回調(diào)onDragComplete, 用戶可在該方法中將該控件從父布局中刪除, 或這進(jìn)行其他操作。 如果用戶拖拽的距離小于臨界值, 那么當(dāng)用戶松開(kāi)手指時(shí)控件會(huì)回談到原來(lái)的初始位置。這時(shí)會(huì)觸發(fā)onDragRebound回調(diào)。 如果用戶觸摸控件之后沒(méi)有拖拽而是直接松開(kāi)手指, 會(huì)觸發(fā)onClick回調(diào), 這樣用戶就不用為該控件設(shè)置onClick監(jiān)聽(tīng)。

源碼如下:


import android.util.Log; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.ViewGroup; 
 
/** 
 * Created by zhangjg on 14-10-10. 
 */ 
public class DragTouchListener implements View.OnTouchListener { 
 
  /** 
   * drag directions 
   */ 
  public static final int DIRECTION_UP = 0; 
  public static final int DIRECTION_DOWN = 1; 
  public static final int DIRECTION_LEFT = 2; 
  public static final int DIRECTION_RIGHT = 3; 
 
 
  private int mDragDirection = -1; 
  private int mDragDistance = -1; 
  private ViewGroup.MarginLayoutParams mParams; 
  private ViewGroup.MarginLayoutParams mOriginParams; 
 
 
  private int viewOriginMargin = -1000; 
 
  private float mStartY = 0; 
  private float mStartX = 0; 
  private boolean isTouched = false; 
 
  public DragTouchListener(int dragDirection, int dragDistance){ 
    mDragDirection = dragDirection; 
    mDragDistance = dragDistance; 
  } 
 
  protected void onClick(View view){ 
 
  } 
 
  protected void onDragComplete(View view){ 
 
  } 
 
  protected void onDragRebound(View view){ 
 
  } 
 
  @Override 
  public boolean onTouch(View view, MotionEvent motionEvent) { 
 
 
    if (viewOriginMargin == -1000){ 
      mParams = (ViewGroup.MarginLayoutParams)view.getLayoutParams(); 
      if (mDragDirection == DIRECTION_UP) { 
        viewOriginMargin = mParams.bottomMargin; 
      }else if (mDragDirection == DIRECTION_DOWN){ 
        viewOriginMargin = mParams.topMargin; 
      }else if (mDragDirection == DIRECTION_LEFT){ 
        viewOriginMargin = mParams.rightMargin; 
      }else if (mDragDirection == DIRECTION_RIGHT){ 
        viewOriginMargin = mParams.leftMargin; 
      } 
    } 
 
 
    int action = motionEvent.getAction(); 
    switch (action){ 
      case MotionEvent.ACTION_DOWN: 
        isTouched = true; 
        mStartY = motionEvent.getY(); 
        mStartX = motionEvent.getX(); 
        return true; 
      case MotionEvent.ACTION_MOVE: 
        float y = motionEvent.getY(); 
        float x = motionEvent.getX(); 
 
        if (mDragDirection == DIRECTION_UP){ 
          if(y < mStartY){ 
            mParams.bottomMargin = viewOriginMargin +(int) (mStartY - y); 
          } 
        }else if (mDragDirection == DIRECTION_DOWN){ 
          if (y > mStartY){ 
            mParams.topMargin = viewOriginMargin + (int) (y - mStartY); 
          } 
        }else if (mDragDirection == DIRECTION_LEFT){ 
          if (x < mStartX){ 
            mParams.rightMargin = viewOriginMargin + (int) (mStartX - x); 
          } 
        }else if (mDragDirection == DIRECTION_RIGHT){ 
          if (x > mStartX){ 
            mParams.leftMargin = viewOriginMargin + (int) (x - mStartX); 
          } 
        } 
 
        view.setLayoutParams(mParams); 
        break; 
      case MotionEvent.ACTION_UP: 
        float nowY = motionEvent.getY(); 
        float nowX = motionEvent.getX(); 
 
        int deltaX = (int)nowX - (int)mStartX; 
        int deltaY = (int)nowY - (int)mStartY; 
 
        if (isTouched && Math.abs(deltaX) < 5 && Math.abs(deltaY) < 5){ 
          onClick(view); 
          break; 
        } 
 
        if (mDragDirection == DIRECTION_UP){ 
          if (isTouched && mStartY - nowY > mDragDistance){ 
 
//            Log.i("test-drag", "direction up , startY = " + mStartY + ", nowY = " + nowY + 
//                ", startY - nowY = " + (mStartY - nowY) + ", dragDistance : " + mDragDistance); 
            onDragComplete(view); 
 
          }else if (mStartY - nowY > 0 && mStartY - nowY < mDragDistance ){ 
            mParams.bottomMargin = viewOriginMargin; 
            view.setLayoutParams(mParams); 
            onDragRebound(view); 
          } 
        }else if (mDragDirection == DIRECTION_DOWN){ 
 
          if (isTouched && nowY - mStartY > mDragDistance){ 
            onDragComplete(view); 
          }else if ( nowY - mStartY > 0 && nowY - mStartY < mDragDistance ){ 
            mParams.topMargin = viewOriginMargin; 
            view.setLayoutParams(mParams); 
            onDragRebound(view); 
          } 
        }else if (mDragDirection == DIRECTION_LEFT){ 
          if (isTouched && mStartX - nowX > mDragDistance){ 
            onDragComplete(view); 
          }else if ( mStartX - nowX > 0 && mStartX - nowX < mDragDistance ){ 
            mParams.rightMargin = viewOriginMargin; 
            view.setLayoutParams(mParams); 
            onDragRebound(view); 
          } 
        }else if (mDragDirection == DIRECTION_RIGHT){ 
          if (isTouched && nowX - mStartX > mDragDistance){ 
            onDragComplete(view); 
          }else if ( nowX - mStartX > 0 && nowX - mStartX < mDragDistance ){ 
            mParams.leftMargin = viewOriginMargin; 
            view.setLayoutParams(mParams); 
            onDragRebound(view); 
          } 
        } 
 
        isTouched = false; 
 
        break; 
    } 
    return false; 
  } 
} 

在使用時(shí)繼承該類, 并覆蓋三個(gè)回調(diào)方法, 就可以在合適的時(shí)機(jī)得到回調(diào)。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • Android開(kāi)發(fā)自定義控件之折線圖實(shí)現(xiàn)方法詳解

    Android開(kāi)發(fā)自定義控件之折線圖實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了Android開(kāi)發(fā)自定義控件之折線圖實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了Android自定義控件中折線圖原理、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下
    2020-05-05
  • Flutter實(shí)現(xiàn)圖文并茂的列表

    Flutter實(shí)現(xiàn)圖文并茂的列表

    列表在 App 中是最常見(jiàn)的形式了,在 Flutter 中提供了 ListView 這個(gè)組件來(lái)實(shí)現(xiàn)列表,本篇將通過(guò) ListView 實(shí)現(xiàn)一個(gè)圖文并茂的列表。
    2021-05-05
  • Android擴(kuò)大View點(diǎn)擊區(qū)域方案示例

    Android擴(kuò)大View點(diǎn)擊區(qū)域方案示例

    這篇文章主要為大家介紹了Android擴(kuò)大View點(diǎn)擊區(qū)域方案示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Android自定義荷載進(jìn)度的兩種方法

    Android自定義荷載進(jìn)度的兩種方法

    進(jìn)度條在App中非常常見(jiàn),例如下載進(jìn)度、加載圖片、打開(kāi)文章、打開(kāi)網(wǎng)頁(yè)等等……本篇文章主要介紹了Android自定義荷載進(jìn)度的兩種方法,有需要的朋友可以了解一下。
    2016-10-10
  • Android實(shí)現(xiàn)Unity3D下RTMP推送的示例

    Android實(shí)現(xiàn)Unity3D下RTMP推送的示例

    像Unity3D下的RTMP或RTSP播放器一樣,好多開(kāi)發(fā)者苦于在Unity環(huán)境下,如何高效率低延遲的把數(shù)據(jù)采集并編碼實(shí)時(shí)推送到流媒體服務(wù)器,實(shí)現(xiàn)Unity場(chǎng)景下的低延遲推拉流方案。本文介紹幾種RTMP推送的方案
    2021-06-06
  • Android不規(guī)則封閉區(qū)域填充色彩的實(shí)例代碼

    Android不規(guī)則封閉區(qū)域填充色彩的實(shí)例代碼

    這篇文章主要介紹了Android不規(guī)則封閉區(qū)域填充色彩的實(shí)例代碼, 具有很好的參考價(jià)值,希望對(duì)大家有所幫助,一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Android調(diào)用外置攝像頭的方法

    Android調(diào)用外置攝像頭的方法

    這篇文章主要為大家詳細(xì)介紹了Android調(diào)用外置攝像頭的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Android課程表界面布局實(shí)現(xiàn)代碼

    Android課程表界面布局實(shí)現(xiàn)代碼

    這篇文章主要介紹了Android課程表界面布局實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Android SharedPreferences的使用分析

    Android SharedPreferences的使用分析

    本篇文章小編為大家介紹,Android SharedPreferences的使用分析。需要的朋友參考下
    2013-04-04
  • Android ContentProvider基礎(chǔ)應(yīng)用詳解

    Android ContentProvider基礎(chǔ)應(yīng)用詳解

    ContentProvider是android四大組件之一。它是不同應(yīng)用程序之間交換數(shù)據(jù)的標(biāo)準(zhǔn)api,ContentProvider以某種uri的形式對(duì)外提供數(shù)據(jù),允許其它應(yīng)用程序?qū)ζ湓L問(wèn)或者修改數(shù)據(jù)。本文將介紹ContentProvider的基礎(chǔ)應(yīng)用,感興趣的可以學(xué)習(xí)一下
    2021-12-12

最新評(píng)論

横峰县| 鄱阳县| 黄梅县| 泗洪县| 确山县| 丽江市| 鸡泽县| 潜江市| 古蔺县| 临高县| 从江县| 荆门市| 德州市| 昆山市| 高阳县| 商南县| 赫章县| 焦作市| 滨海县| 涡阳县| 东乌| 遵化市| 通道| 南木林县| 时尚| 西贡区| 镇坪县| 岳池县| 土默特右旗| 迭部县| 兴宁市| 松桃| 湖北省| 辽阳市| 施秉县| 勃利县| 边坝县| 利辛县| 绥宁县| 嘉峪关市| 洛宁县|