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

Android開發(fā)使用自定義view實現(xiàn)ListView下拉的視差特效功能

 更新時間:2017年10月17日 10:42:04   作者:CharlinGod  
這篇文章主要介紹了Android開發(fā)使用自定義view實現(xiàn)ListView下拉的視差特效功能,結(jié)合實例形式詳細(xì)分析了Android重寫ListView控件實現(xiàn)ListView下拉視差效果的步驟與相關(guān)操作技巧,需要的朋友可以參考下

本文實例講述了Android開發(fā)使用自定義view實現(xiàn)ListView下拉的視差特效功能。分享給大家供大家參考,具體如下:

一、概述:

現(xiàn)在流型的APP如微信朋友圈,QQ空間,微博個人展示都有視差特效的影子。

如圖:下拉圖片會產(chǎn)生圖片拉升的效果,放手后圖片有彈回到原處:

那我們?nèi)绾螌崿F(xiàn)呢?

1)重寫ListView控件:
2)重寫里面的overScrollBy方法
3)在松手后執(zhí)行值動畫

二、具體實現(xiàn):

1.創(chuàng)建ParallaListView 自定義ListView

public class ParallaListView extends ListView {
  private static final String TAG = "tag";
  public ParallaListView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
  }
  public ParallaListView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }
  public ParallaListView(Context context) {
    this(context, null);
  }
}

2)添加到布局里:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" >
  <com.android.imooc.paralla.ParallaListView
    android:id="@+id/lv_paralla"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
  </com.android.imooc.paralla.ParallaListView>
</LinearLayout>

3)生成主頁,填充數(shù)據(jù):

public class ParallaActivity extends Activity {
  private ParallaListView mListView;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_paralla);
    initViews();
  }
  private void initViews() {
    mListView = (ParallaListView) findViewById(R.id.lv_paralla);
    mListView.setAdapter(new ArrayAdapter<String>(ParallaActivity.this, android.R.layout.simple_list_item_1, Cheeses.NAMES));
  }
}

4)創(chuàng)建頭布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" >
  <ImageView
    android:id="@+id/iv_header"
    android:scaleType="centerCrop"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/parallax_img" />
</LinearLayout>

圖片設(shè)成scaleType="centerCrop"模式

其它模式說明:

5)在主頁里找到頭布局并添加到listview里

View mHeader = LayoutInflater.from(this).inflate(R.layout.view_paralla_header, null);
mListView = (ParallaListView) findViewById(R.id.lv_paralla);
mListView.addHeaderView(mHeader);

三、功能實現(xiàn):

1.現(xiàn)在基本能看到效果了,但我們必須要拖動圖片,這就要實現(xiàn)這個方法overScrollBy

因為拖動是Y軸方向,所以只要打印Y軸方向的各個參數(shù)就好了

@Override
protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX,
  int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
    Logger.i(TAG, "deltaY="+deltaY + " scrollX="+scrollX+ " scrollRangeY="+scrollRangeY + " maxOverScrollY=" +maxOverScrollY + " isTouchEvent=" +isTouchEvent);
    return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY,
        isTouchEvent);
}

得到數(shù)據(jù)下拉:deltaY=-3 scrollX=0 scrollRangeY=0 maxOverScrollY=0 isTouchEvent=true

得到數(shù)據(jù)上拉:deltaY=4 scrollX=0 scrollRangeY=0 maxOverScrollY=0 isTouchEvent=true

2.如果是下拉,我們把值賦給header,但我們?nèi)绾潍@得高度呢?

1)在主頁里初始化圖片,然后設(shè)置到parallaListView里

ImageView iv = (ImageView) findViewById(R.id.iv_head);
mListView.setParallaImage(iv);

2)在parallaListView創(chuàng)建方法setParallaImage

public void setParallaImage(ImageView iv) {
    mImageView = iv;
    //在這個方法里獲得高度
    int height = iv.getHeight();
    int measureHeight = iv.getMeasuredHeight();
    int instrinsicHeight = iv.getDrawable().getIntrinsicHeight();
    Logger.i(TAG, "height="+height + " measureHeight="+measureHeight+ " instrinsicHeight="+instrinsicHeight );
}

得到結(jié)果:height=0 measureHeight=0 instrinsicHeight=732

為什么會如此:因為此時的圖片還沒有初始化

那我們?nèi)绾蔚玫礁叨饶兀?/p>

記得有個方法叫做iv.getViewTreeObserver(),那我們就在這個方法的監(jiān)聽事件里得到高度

iv.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
  @Override
  public void onGlobalLayout() {
    //當(dāng)布局填充完成后,此方法會被調(diào)用
    mListView.setParallaImage(iv);
    //移除監(jiān)聽
    iv.getViewTreeObserver().removeGlobalOnLayoutListener(this);
  }
});

此時得到的高度height=240 measureHeight=240 instrinsicHeight=732

3)把值賦給圖片就能實現(xiàn)拉伸的效果了

if (isTouchEvent && deltaY < 0) {
  mHeight += Math.abs(deltaY);
  if (mHeight <= mBitmapHeight) {
    mImageView.getLayoutParams().height = mHeight;
    mImageView.requestLayout();
  }
}

3.松手后圖片回彈,這個功能在onTouchEvent里實現(xiàn):

@Override
public boolean onTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
    case MotionEvent.ACTION_UP:
      final int startHeight = mImageView.getHeight();
      final int endHeight = mBitmapHeight;
      //值動畫
      //valueAnim(startHeight, endHeight);
      //豎直移動動畫
      ResetAnimation anim = new ResetAnimation(mImageView, startHeight, endHeight);
      anim.setInterpolator(new OvershootInterpolator());
      startAnimation(anim);
      break;
    default:
      break;
    }
    return super.onTouchEvent(ev);
}

4、動畫實現(xiàn):

/**
 * @描述     使用平移動畫實現(xiàn)下拉圖片后彈射回去
 * @項目名稱   App_imooc
 * @包名     com.android.imooc.paralla
 * @類名     ResetAnimation
 * @author   chenlin
 * @date    2016年5月29日 下午12:27:00
 * @version   1.0
 */
public class ResetAnimation extends Animation {
  private ImageView mImageView;
  private int mStartHeight;
  private int mEndHeight;
  public ResetAnimation(ImageView imageView, int startHeight, int endHeight) {
    this.mImageView = imageView;
    this.mStartHeight = startHeight;
    this.mEndHeight = endHeight;
    setDuration(500);
  }
  @Override
  protected void applyTransformation(float interpolatedTime, Transformation t) {
    int newHeight = (int) (ValueUtil.evalute(interpolatedTime, mStartHeight, mEndHeight) + 0.5f);
    mImageView.getLayoutParams().height = newHeight;
    mImageView.requestLayout();
    super.applyTransformation(interpolatedTime, t);
  }
}

四、源碼下載:

完整實例代碼點擊此處本站下載。

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android控件用法總結(jié)》、《Android開發(fā)入門與進(jìn)階教程》、《Android視圖View技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android數(shù)據(jù)庫操作技巧總結(jié)》及《Android資源操作技巧匯總

希望本文所述對大家Android程序設(shè)計有所幫助。

相關(guān)文章

  • android實現(xiàn)狀態(tài)欄添加圖標(biāo)的函數(shù)實例

    android實現(xiàn)狀態(tài)欄添加圖標(biāo)的函數(shù)實例

    這篇文章主要介紹了android實現(xiàn)狀態(tài)欄添加圖標(biāo)的函數(shù),較為詳細(xì)的分析了Android狀態(tài)欄添加及刪除圖標(biāo)的具體實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • Android編程自定義Notification實例分析

    Android編程自定義Notification實例分析

    這篇文章主要介紹了Android編程自定義Notification的用法,結(jié)合實例形式簡單分析了自定義Notification的具體功能與實現(xiàn)技巧,需要的朋友可以參考下
    2015-12-12
  • Android自定義滑動解鎖控件使用詳解

    Android自定義滑動解鎖控件使用詳解

    這篇文章主要為大家詳細(xì)介紹了Android自定義滑動解鎖控件的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Android自定義View仿騰訊TIM下拉刷新View

    Android自定義View仿騰訊TIM下拉刷新View

    這篇文章主要給大家介紹了關(guān)于Android自定義View仿騰訊TIM下拉刷新View的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • Android實現(xiàn)手勢密碼功能

    Android實現(xiàn)手勢密碼功能

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)手勢密碼功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android實現(xiàn)ListView數(shù)據(jù)動態(tài)加載的方法

    Android實現(xiàn)ListView數(shù)據(jù)動態(tài)加載的方法

    這篇文章主要介紹了Android實現(xiàn)ListView數(shù)據(jù)動態(tài)加載的方法,通過ListView控件綁定setOnScrollListener方法簡單實現(xiàn)動態(tài)加載數(shù)據(jù)的功能,需要的朋友可以參考下
    2016-01-01
  • android源碼探索之定制android關(guān)機(jī)界面的方法

    android源碼探索之定制android關(guān)機(jī)界面的方法

    這篇文章主要介紹了android源碼探索之定制android關(guān)機(jī)界面的方法,較為詳細(xì)的分析了Android關(guān)機(jī)界面的相關(guān)原理與代碼實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • Android基于OpenCV實現(xiàn)QR二維碼檢測

    Android基于OpenCV實現(xiàn)QR二維碼檢測

    QR碼比普通一維條碼具有快速讀取和更大的存儲資料容量,也無需要像一維條碼般在掃描時需要直線對準(zhǔn)掃描儀。因此其應(yīng)用范圍已經(jīng)擴(kuò)展到包括產(chǎn)品跟蹤,物品識別,文檔管理,庫存營銷等方面。本文講解Android基于OpenCV實現(xiàn)QR二維碼檢測的步驟
    2021-06-06
  • Android Studio Intent隱式啟動,發(fā)短信,撥號,打電話,訪問網(wǎng)頁等實例代碼

    Android Studio Intent隱式啟動,發(fā)短信,撥號,打電話,訪問網(wǎng)頁等實例代碼

    這篇文章主要介紹了Android Studio Intent隱式啟動,發(fā)短信,撥號,打電話,訪問網(wǎng)頁等實例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • SQLite數(shù)據(jù)庫在Android中的使用小結(jié)

    SQLite數(shù)據(jù)庫在Android中的使用小結(jié)

    SQLIte是一款輕型的數(shù)據(jù)庫,占用資源非常低,在嵌入式設(shè)備中,可能只需幾百k的內(nèi)存,這篇文章主要介紹了SQLite數(shù)據(jù)庫在Android中的使用,需要的朋友可以參考下
    2024-07-07

最新評論

温州市| 金秀| 通榆县| 维西| 南开区| 安溪县| 邵阳县| 泰兴市| 武冈市| 乐亭县| 祁连县| 且末县| 会理县| 乐山市| 循化| 昌都县| 遂溪县| 大石桥市| 福贡县| 石狮市| 蛟河市| 竹山县| 荔浦县| 博白县| 茂名市| 揭东县| 安宁市| 宁陕县| 宿松县| 安阳市| 长寿区| 临沭县| 土默特左旗| 公主岭市| 监利县| 噶尔县| 邵阳县| 遂平县| 犍为县| 大姚县| 八宿县|