2018-03-14(霧霾天氣)關於QQ空間個人中心頭像下拉放大效果

昨晚失眠了~~~~~哎。早上起來,有是霧霾天氣。你敢信。。。讓我們繼續吧!


今天給大家講解一篇仿qq空間個人中心背景可以下拉放大的列子~~

話不多說先上圖(哈哈)


就是這個效果了,還是相當的清晰地~



我在這是用的ListView。上代碼把

**

*

* @author dell

* @date 2018/3/14

*/

public class MyListViewextends ListView{

private ImageViewheaderView ;

private int      originHeight;

private int      maxHeight;

public MyListView(Context context) {

super(context);

}

public MyListView(Context context, AttributeSet attrs) {

super(context, attrs);

}

public MyListView(Context context, AttributeSet attrs,int defStyleAttr) {

super(context, attrs, defStyleAttr);

}

public void setParallaxImageView(ImageView headerView) {

this.headerView = headerView ;

originHeight = headerView.getHeight();

maxHeight = headerView.getDrawable().getIntrinsicHeight();

}

/**

* 重寫overScrollBy,能獲取ListView下拉的距離

*

    * @param deltaX:橫向的變化量

    * @param deltaY:縱向的變化量

    * @param scrollX:橫向X的偏移量

    * @param scrollY:縱向Y的偏移量

    * @param scrollRangeX:橫向X偏移範圍

    * @param scrollRangeY:縱向Y的偏移範圍

    * @param maxOverScrollX:橫向X最大的偏移量

    * @param maxOverScrollY:縱向Y最大的偏移量

    * @param isTouchEvent:是否是觸摸產生的滑動超出

    * @return

    */

    @Override

    protected boolean overScrollBy(int deltaX,int deltaY,int scrollX,int scrollY,int scrollRangeX,int scrollRangeY,int maxOverScrollX,int                 maxOverScrollY,boolean isTouchEvent) {

   if (isTouchEvent && deltaY <0){

   int newHeight = (int) (headerView.getHeight() + Math.abs(deltaY /3.0f));

   newHeight = Math.min(newHeight,maxHeight);

   headerView.getLayoutParams().height = newHeight ;

   headerView.requestLayout();

}

return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);

}

/**

* ResetAnimation 爲封裝的動畫類

    * @param ev

    * @return

    */

    @Override

    public boolean onTouchEvent(MotionEvent ev) {

    if (MotionEventCompat.getActionMasked(ev) == MotionEvent.ACTION_UP){

    ResetAnimation resetAnimation =new ResetAnimation(headerView,originHeight);

    headerView.startAnimation(resetAnimation);

}

return super.onTouchEvent(ev);

}

}

個人覺得還是很簡單的。哈哈,接下來看動畫類(ResetAnimation )

public class ResetAnimationextends Animation {

private int      startHeight;

private int      tragetHeight;

private ImageViewimageView;

public ResetAnimation(ImageView imageView,int tragetHeight) {

this.imageView = imageView ;

this.startHeight = imageView.getHeight();

this.tragetHeight = tragetHeight;

this.setDuration(500);

setInterpolator(new OvershootInterpolator());

System.out.println("構造函數被調用了");

}

/**

*

* @param interpolatedTime:從0.0 ————> 到1.0的百分比

    * @param t

    */

    @Override

    protected void applyTransformation(float interpolatedTime, Transformation t) {

    IntEvaluator intEvaluator =new IntEvaluator();

    Integer newHeight = intEvaluator.evaluate(interpolatedTime,startHeight,tragetHeight);

    System.out.println(startHeight);

   imageView.getLayoutParams().height = newHeight ;

   imageView.requestLayout();

}

至於mainactivity就跟簡單了~~

private static final String[]names =new String[]{

"我愛你❤",

"我愛你❤",

"我愛你❤",

"我愛你❤",

"我愛你❤",

"我愛你❤",

"我愛你❤",

"我愛你❤",

"我愛你❤",

"我愛你❤",

"我愛你❤",

"我愛你❤",

};

private MyListViewlv;

private ImageViewheaderView;

private Viewview;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initViews();

initData();

}

private void initData() {

lv.addHeaderView(view);

lv.setAdapter(new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1,names) {

@Override

public View getView(int position, View convertView, ViewGroup parent) {

TextView tv = (TextView)super.getView(position, convertView, parent);

tv.setTextColor(Color.BLACK);

return tv;

}

});

//設置滾動模式

    lv.setOverScrollMode(ListView.OVER_SCROLL_NEVER);

headerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

@Override

        public void onGlobalLayout() {

lv.setParallaxImageView(headerView);

headerView.getViewTreeObserver().removeGlobalOnLayoutListener(this);

}

});

}

private void initViews() {

view = View.inflate(MainActivity.this, R.layout.activity_heander,null);

headerView = (ImageView)view.findViewById(R.id.iv);

lv = (MyListView) findViewById(R.id.my_listview);

}

在你的main的xml裏面佈局引用你的自定義的myListview。

請忽略變量名。哈哈。到這就結束了。如果有好的方法希望指出,不對的地方各位大佬也要指出~~謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章