国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android ViewDragHelper使用方法詳解

2019-12-12 01:30:52
字體:
供稿:網(wǎng)友

幫我們實(shí)現(xiàn)各種類型的復(fù)雜手勢(shì)操作。其實(shí)例通過靜態(tài)工廠創(chuàng)建ViewDragHelper一般用在一個(gè)自定義ViewGroup的內(nèi)部。

初始化操作

 private ViewDragHelper mDrragHelper;  public SlideViewGroup(@NonNull Context context) {    this(context,null);  }  public SlideViewGroup(@NonNull Context context, @Nullable AttributeSet attrs) {    this(context, attrs,0);  }  public SlideViewGroup(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {    super(context, attrs, defStyleAttr);    mDrragHelper=ViewDragHelper.create(this,1.0f,mCallback);  }

mDrragHelper=ViewDragHelper.create(this,1.0f,mCallback);第一個(gè)操作表示當(dāng)前操作的對(duì)象,第二個(gè)參數(shù)為手勢(shì)操作敏感度,
第三個(gè)參數(shù)為我們手勢(shì)處理的毀掉接口

我們需要先在view事件分發(fā)時(shí)把手勢(shì)操作交給ViewFragHelper

@Override  public boolean onInterceptTouchEvent(MotionEvent event) {    //交給viewdrag去攔截    //事件分發(fā)攔截    float x=0;    int action = event.getAction();    switch(action){      case MotionEvent.ACTION_DOWN:        x =event.getX();        break;        // return false;      case MotionEvent.ACTION_MOVE:        if (STATE==0&getX()-x<0){          return mDrragHelper.shouldInterceptTouchEvent(event);        }else if (STATE==1){          return mDrragHelper.shouldInterceptTouchEvent(event);        }        break;    }    return false;  }//boolean control=true;//控制downx的初始化  @Override  public boolean onTouchEvent(MotionEvent event) {    mDrragHelper.processTouchEvent(event);    //if (control)    float downX=0;    if (event.getAction()==MotionEvent.ACTION_DOWN){      downX=event.getRawX();      if (STATE==1){        //if (event.getRawX()>0&downX<leftWidth-rightViewWidth)        //close();        // Toast.makeText(this.getContext(), "leftWidth"+leftWidth+"rawx"+event.getRawX(), Toast.LENGTH_SHORT).show();      }    }    if (event.getAction()==MotionEvent.ACTION_UP){      //Toast.makeText(this.getContext(), "downx"+downX, Toast.LENGTH_SHORT).show();      //點(diǎn)擊刪除//&downX>leftWidth-rightViewWidth&downX<leftWidth-rightViewWidth/2     // Toast.makeText(this.getContext(), "刪除1", Toast.LENGTH_SHORT).show();      if (STATE==1&event.getRawX()>leftWidth-rightViewWidth&event.getRawX()<leftWidth-rightViewWidth/2){        // Toast.makeText(this.getContext(), "刪除2", Toast.LENGTH_SHORT).show();        if (skipListener!=null){         // Toast.makeText(this.getContext(), "刪除3", Toast.LENGTH_SHORT).show();          skipListener.onDelete();        }        // Toast.makeText(this.getContext(), "刪除", Toast.LENGTH_SHORT).show();      }      //點(diǎn)擊刪除&downX>leftWidth-rightViewWidth/2&downX<leftWidth-rightViewWidth      if (STATE==1&event.getRawX()>leftWidth-rightViewWidth/2&event.getRawX()<leftWidth){        // Toast.makeText(this.getContext(), "修改", Toast.LENGTH_SHORT).show();        if (skipListener!=null){          skipListener.onDefine();        }      }    }    return true;  }

重點(diǎn)在這兩句

mDrragHelper.shouldInterceptTouchEvent(event); mDrragHelper.processTouchEvent(event);

我們可以在onInterceptTouchEvent決定什么時(shí)候把事件交給我們的手勢(shì)操作類
然后是回調(diào)類

private ViewDragHelper.Callback mCallback=new ViewDragHelper.Callback() {    @Override    public boolean tryCaptureView(View child, int pointerId) {      return child==leftView;    }    @Override    public int clampViewPositionHorizontal(View child, int left, int dx) {      if (left>=0)        return 0;      if (left<-rightViewWidth)        return -rightViewWidth;      return left;    }    @Override    public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {      super.onViewPositionChanged(changedView, left, top, dx, dy);      rightView.layout(leftWidth + left, 0, leftWidth + rightViewWidth, viewHeight);      /* if (left<0&left>rightViewWidth/2){      mDrragHelper.smoothSlideViewTo(leftView,left,0);      mDrragHelper.smoothSlideViewTo(rightView,left,0);      }*/      /* if (left>=-(leftWidth+rightViewWidth)) {        rightView.layout(leftWidth + left, 0, leftWidth + rightViewWidth, viewHeight);      }      if (left<-(leftWidth+rightViewWidth)){        rightView.layout(leftWidth, 0, leftWidth + rightViewWidth, viewHeight);      }*/    }    @Override    public void onViewReleased(View releasedChild, float xvel, float yvel) {      super.onViewReleased(releasedChild, xvel, yvel);      Log.i("left xvel",xvel+"y"+yvel);      if (xvel<0){        open();/* mDrragHelper.smoothSlideViewTo(rightView,rightViewWidth/2,0);*/      }else if (leftView.getLeft()<-rightViewWidth/2)      {open();}else {        // Log.i("left open","open");        close();      }    }    @Override    public int getViewHorizontalDragRange(View child) {      return -rightViewWidth;    }    @Override    public void onEdgeTouched(int edgeFlags, int pointerId) {      super.onEdgeTouched(edgeFlags, pointerId);    }  };

tryCaptureView的返回值表示我們?cè)试S操作的child
clampViewPositionHorizontal()方法的默認(rèn)返回值為0,返回值代表水平移動(dòng)的距離,也就是left值,當(dāng)返回left值時(shí),我們操作的view就會(huì)跟著我們的拖動(dòng)而移動(dòng),當(dāng)然還有數(shù)值方向的方法,如果需要也可以重寫豎直操作的方法
onViewPositionChanged()方法就是當(dāng)我們移動(dòng)時(shí)就會(huì)回調(diào)這個(gè)方法,此處的left參數(shù)就是水平移動(dòng)返回的left,dx就是水平距離相對(duì)變化
onViewRelased()方法就是手指抬起時(shí)(釋放)時(shí)回調(diào)的方法,xvel每秒鐘水平速度速度慢時(shí)為0,單位為像素,yvel為每秒鐘豎直方向的速度。速度有正負(fù)之分
滑動(dòng)邊緣:

分為滑動(dòng)左邊緣還是右邊緣:EDGE_LEFT和EDGE_RIGHT,下面的代碼設(shè)置了可以處理滑動(dòng)左邊緣:

mDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);
假如如上設(shè)置,onEdgeTouched方法會(huì)在左邊緣滑動(dòng)的時(shí)候被調(diào)用,這種情況下一般都是沒有和子view接觸的情況。

@Overridepublic void onEdgeTouched(int edgeFlags, int pointerId) {  super.onEdgeTouched(edgeFlags, pointerId);  Toast.makeText(getContext(), "edgeTouched", Toast.LENGTH_SHORT).show();}

如果你想在邊緣滑動(dòng)的時(shí)候根據(jù)滑動(dòng)距離移動(dòng)一個(gè)子view,可以通過實(shí)現(xiàn)onEdgeDragStarted方法,并在onEdgeDragStarted方法中手動(dòng)指定要移動(dòng)的子View

@Overridepublic void onEdgeDragStarted(int edgeFlags, int pointerId) {  mDragHelper.captureChildView(mDragView2, pointerId);}

滑動(dòng)

手指在當(dāng)前view的下邊緣就可以滑動(dòng)

下面看一個(gè)我在ontochEvent調(diào)用的方法

public void open(){    if (listener!=null){      listener.onOpen(this);    }    if (mDrragHelper.smoothSlideViewTo(leftView,-rightViewWidth,0))      ViewCompat.postInvalidateOnAnimation(SlideViewGroup.this);    STATE=1;  }

就是平滑滑動(dòng),
ViewCompat.postInvalidateOnAnimation(SlideViewGroup.this)
上面那個(gè)方法就是刷新布局(重繪操作)
然后會(huì)回調(diào)次viewgroup的computerScroll

@Override  public void computeScroll() {    if (mDrragHelper.continueSettling(true)) {      ViewCompat.postInvalidateOnAnimation(this);    }  }

其實(shí)滑動(dòng)本身還是調(diào)用的scrollto跟據(jù)時(shí)間百分比移動(dòng),根據(jù)比例移動(dòng)固定距離后就不移動(dòng)了,所以我們需要重復(fù)刷新,需要判斷臨界條件,可能是時(shí)間可能是距離,可以點(diǎn)進(jìn)continueSetting方法返回false代表動(dòng)畫完成,進(jìn)去一看就明白了,需要判斷滑動(dòng)事件是否完成,如果完成就不再刷新,如果沒完成就刷新。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 长汀县| 安国市| 宝鸡市| 项城市| 马边| 五莲县| 潼南县| 永泰县| 县级市| 平和县| 阳曲县| 临泽县| 丰城市| 武夷山市| 桐城市| 新津县| 江永县| 榕江县| 琼结县| 衡阳市| 淮北市| 克拉玛依市| 梅州市| 灵石县| 鸡西市| 赫章县| 出国| 大洼县| 噶尔县| 花垣县| 旬邑县| 武安市| 华池县| 焦作市| 会昌县| 霸州市| 莱州市| 汝城县| 云阳县| 白朗县| 海晏县|