昨晚失眠了~~~~~哎。早上起來锡凝,有是霧霾天氣粘昨。你敢信。窜锯。张肾。讓我們繼續(xù)吧!
今天給大家講解一篇仿qq空間個(gè)人中心背景可以下拉放大的列子~~
話不多說先上圖(哈哈)
就是這個(gè)效果了锚扎,還是相當(dāng)?shù)那逦貇
我在這是用的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:是否是觸摸產(chǎn)生的滑動(dòng)超出
? ? * @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 為封裝的動(dòng)畫類
? ? * @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);
}
}
個(gè)人覺得還是很簡(jiǎn)單的驾孔。哈哈芍秆,接下來看動(dòng)畫類(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("構(gòu)造函數(shù)被調(diào)用了");
}
/**
*
* @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就跟簡(jiǎn)單了~~
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;
}
});
//設(shè)置滾動(dòng)模式
? ? 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。
請(qǐng)忽略變量名翠勉。哈哈妖啥。到這就結(jié)束了。如果有好的方法希望指出对碌,不對(duì)的地方各位大佬也要指出~~謝謝荆虱!