欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android實(shí)現(xiàn)View滑動的6種方式

 更新時間:2017年05月25日 14:11:50   作者:一生中所愛  
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)View滑動的6種方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Android實(shí)現(xiàn)View滑動的具體方法,供大家參考,具體內(nèi)容如下

1.View的滑動簡介

View的滑動是Android實(shí)現(xiàn)自定義控件的基礎(chǔ),同時在開發(fā)中我們也難免會遇到View的滑動的處理。其實(shí)不管是那種滑動的方式基本思想都是類似的:當(dāng)觸摸事件傳到View時,系統(tǒng)記下觸摸點(diǎn)的坐標(biāo),手指移動時系統(tǒng)記下移動后的觸摸的坐標(biāo)并算出偏移量,并通過偏移量來修改View的坐標(biāo)。
實(shí)現(xiàn)View滑動有很多種方法,這篇文章主要講解六種滑動的方法,分別是:layout()、offsetLeftAndRight()與offsetTopAndBottom()、LayoutParams、動畫、scollTo與scollBy和Scroller;在下一篇文章我們會詳細(xì)介紹屬性動畫。

2.實(shí)現(xiàn)View滑動的六種方法

1.layout()

view進(jìn)行繪制的時候會調(diào)用onLayout()方法來設(shè)置顯示的位置,因此我們同樣也可以通過修改View的left、top、right、bottom這四種屬性來控制View的坐標(biāo)。首先我們要自定義一個View,在onTouchEvent()方法中獲取觸摸點(diǎn)的坐標(biāo):

public boolean onTouchEvent(MotionEvent event) {
  //獲取到手指處的橫坐標(biāo)和縱坐標(biāo)
  int X = 0, newX = 0;
  int Y = 0, newY = 0;
  switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
      Log.d("hahahhaha", "屏幕位置被按下");
      X = (int) event.getX();
      Y = (int) event.getY();
   
      break;

接下來我們在ACTION_MOVE事件中計算偏移量,再調(diào)用layout()方法重新放置這個自定義View的位置就好了:

public boolean onTouchEvent(MotionEvent event) {
  //獲取到手指處的橫坐標(biāo)和縱坐標(biāo)
  int X = 0, newX = 0;
  int Y = 0, newY = 0;
  switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
      Log.d("hahahhaha", "屏幕位置被按下");
      X = (int) event.getX();
      Y = (int) event.getY();

      break;
    case MotionEvent.ACTION_MOVE:
      Log.d("hahahhaha", "屏幕位置在移動");
      newX = (int) event.getX();
      newY = (int) event.getY();
    
      int offsetX = newX - X;
      int offsetY = newY - Y;
      Log.d("hahaha", "offsetX=" + offsetX + ",offsetY=" + offsetY);
      //1.調(diào)用layout方法來重新放置它的位置
      layout(getLeft()+offsetX, getTop()+offsetY,
          getRight()+offsetX , getBottom()+offsetY);

當(dāng)我們每次移動時都會調(diào)用layout()方法來對自己重新布局,從而達(dá)到移動View的效果。

2.offsetLeftAndRight()與offsetTopAndBottom()

這兩種方法和layout()方法效果方法差不多,使用也差不多,我們將ACTION_MOVE中的代碼替換成如下代碼:

      case MotionEvent.ACTION_MOVE:
        //計算移動的距離
        int offsetX = x - lastX;
        int offsetY = y - lastY;
        //對left和right進(jìn)行偏移
        offsetLeftAndRight(offsetX);
        //對top和bottom進(jìn)行偏移
        offsetTopAndBottom(offsetY);
        break;

3.LayoutParams(改變布局參數(shù))

LayoutParams主要保存了一個View的布局參數(shù),因此我們可以通過LayoutParams來改變View的布局的參數(shù)從而達(dá)到了改變View的位置的效果。同樣的我們將ACTION_MOVE中的代碼替換成如下代碼:

LinearLayout.LayoutParams layoutParams= (LinearLayout.LayoutParams) getLayoutParams();
 layoutParams.leftMargin = getLeft() + offsetX;
 layoutParams.topMargin = getTop() + offsetY;
 setLayoutParams(layoutParams);

因?yàn)楦缚丶荓inearLayout,所以我們用了LinearLayout.LayoutParams,如果父控件是RelativeLayout則要使用RelativeLayout.LayoutParams。除了使用布局的LayoutParams外,我們還可以用ViewGroup.MarginLayoutParams來實(shí)現(xiàn):

ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams();
layoutParams.leftMargin = getLeft() + offsetX;
layoutParams.topMargin = getTop() + offsetY;
        setLayoutParams(layoutParams);

4.scollTo與scollBy

scollTo(x,y)表示移動到一個具體的坐標(biāo)點(diǎn),而scollBy(dx,dy)則表示移動的增量為dx、dy。其中scollBy最終也是要調(diào)用scollTo的。scollTo、scollBy移動的是View的內(nèi)容,如果在ViewGroup中使用則是移動他所有的子View。我們將ACTION_MOVE中的代碼替換成如下代碼:

((View)getParent()).scrollBy(-offsetX,-offsetY);

這里要實(shí)現(xiàn)CustomView隨著我們手指移動的效果的話,我們就需要將偏移量設(shè)置為負(fù)值。

5.Scroller

我們用scollTo/scollBy方法來進(jìn)行滑動時,這個過程是瞬間完成的,所以用戶體驗(yàn)不大好。這里我們可以使用Scroller來實(shí)現(xiàn)有過度效果的滑動,這個過程不是瞬間完成的,而是在一定的時間間隔完成的。Scroller本身是不能實(shí)現(xiàn)View的滑動的,它需要配合View的computeScroll()方法才能彈性滑動的效果。
在這里我們實(shí)現(xiàn)CustomView平滑的向右移動。

首先我們要初始化Scroller:

 public CustomView(Context context, AttributeSet attrs) {
    super(context, attrs);
    mScroller = new Scroller(context);
  }

接下來重寫computeScroll()方法,系統(tǒng)會在繪制View的時候在draw()方法中調(diào)用該方法,這個方法中我們調(diào)用父類的scrollTo()方法并通過Scroller來不斷獲取當(dāng)前的滾動值,每滑動一小段距離我們就調(diào)用invalidate()方法不斷的進(jìn)行重繪,重繪就會調(diào)用computeScroll()方法,這樣我們就通過不斷的移動一個小的距離并連貫起來就實(shí)現(xiàn)了平滑移動的效果:

  @Override
  public void computeScroll() {
    super.computeScroll();
    if(mScroller.computeScrollOffset()){
      ((View) getParent()).scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
       //通過不斷的重繪不斷的調(diào)用computeScroll方法
       invalidate();
    } 
  }

調(diào)用Scroller.startScroll()方法。我們在CustomView中寫一個smoothScrollTo()方法,調(diào)用Scroller.startScroll()方法,在2000毫秒內(nèi)沿X軸平移delta像素: 

 public void smoothScrollTo(int destX,int destY){
    int scrollX=getScrollX();
    int delta=destX-scrollX;
    //1000秒內(nèi)滑向destX
    mScroller.startScroll(scrollX,0,delta,0,2000);
    invalidate();
  }

最后我們在ViewSlideActivity.java中調(diào)用CustomView的smoothScrollTo()方法:
          //使用Scroll來進(jìn)行平滑移動
          mCustomView.smoothScrollTo(-400,0);
這里我們是設(shè)定CustomView沿著X軸向右平移400像素。

6.動畫

可以采用View動畫來移動,在res目錄新建anim文件夾并創(chuàng)建translate.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
  <translate android:fromXDelta="0" android:toXDelta="300" android:duration="1000"/>
</set>

在Java代碼中引用:

 mCustomView.setAnimation(AnimationUtils.loadAnimation(this, R.anim.translate));

當(dāng)然使用屬性動畫移動那就更簡單了,我們讓CustomView在1000毫秒內(nèi)沿著X軸像右平移300像素:

ObjectAnimator.ofFloat(mCustomView,"translationX",0,300).setDuration(1000).start();

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論