Android CV系列 > 圖片視差特效
阿新 • • 發佈:2019-02-17
由於RecyclerView 設定頭部並不想ListView那樣聯絡緊密,所以我還是C的Listview
1.MainAc
public class MainActivity extends AppCompatActivity { private MyListView mLv; private ImageView iamge_header; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); List<String> list = new ArrayList<>(); for (int i = 0; i < 30; i++) { list.add("" + i); } MyAdapter myAdapter = new MyAdapter(this, list); View viewHead = View.inflate(this, R.layout.layout_list_header, null); mLv.addHeaderView(viewHead); // mLv.addFooterView(viewFoot); iamge_header = viewHead.findViewById(R.id.iv_header); //等View介面全部繪製完畢的時候,去得到已經繪製完控制元件的寬和高,查一下這個方法,並做一個筆記 iamge_header.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { //寬和高已經測量完畢 mLv.setParallaxImage(iamge_header); //釋放資源 mLv.getViewTreeObserver().removeOnGlobalLayoutListener(this); } }); mLv.setAdapter(myAdapter); } private void initView() { mLv = (MyListView) findViewById(R.id.lv); } }
2.Mainxml 就這一個
3.CustomView
public class MyListView extends ListView { private ImageView iv_header; /**圖片的高度*/ private int drawableHeight; /**ImageView的原始高度*/ private int originalHeight; public MyListView(Context context) { super(context); } public MyListView(Context context, AttributeSet attrs) { super(context, attrs); } public MyListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public void setParallaxImage(ImageView iv_header) { this.iv_header = iv_header; drawableHeight = iv_header.getDrawable().getIntrinsicHeight(); originalHeight = iv_header.getMeasuredHeight(); } /** * * @param deltaX * @param deltaY 豎直方向的瞬時偏移量, 頂部下拉 -, 底部上拉 + * @param scrollX * @param scrollY 垂直方向超出滾動的距離, 頂部-, 底部+ * @param scrollRangeX * @param scrollRangeY 垂直方向滾動範圍 * @param maxOverScrollX * @param maxOverScrollY 最大超出滾動的距離. * @param isTouchEvent 是否是手指觸控.true 觸控到邊界, false 慣性到邊界 * @return */ @Override protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) { if(deltaY < 0 && isTouchEvent){/*頂部下拉, 手指觸控*/ int newHeight = (int) (iv_header.getHeight() + Math.abs(deltaY) / 2.0f);/*下拉的瞬時偏移量加給Header*/ if(newHeight <= drawableHeight){/*限制最大範圍*/ iv_header.getLayoutParams().height = newHeight;/*讓新的高度生效*/ iv_header.requestLayout(); } } return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); } @Override public boolean onTouchEvent(MotionEvent ev) { if(ev.getAction() == MotionEvent.ACTION_UP){/*彈回去*/ ValueAnimator animator = ValueAnimator.ofInt(iv_header.getHeight(), originalHeight);/*把當前的Header高度(220), 設定回原來的高度160*/ animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator anim) { float fraction = anim.getAnimatedFraction(); Integer newHeight = (Integer) anim.getAnimatedValue(); iv_header.getLayoutParams().height = newHeight;/*讓新的高度生效*/ iv_header.requestLayout(); } }); animator.setInterpolator(new OvershootInterpolator(4)); animator.setDuration(500); animator.start(); } return super.onTouchEvent(ev); } }
4.Adapter
public class MyAdapter extends BaseAdapter { private Context context; private List<String> list; public MyAdapter(Context context, List<String> list) { this.context = context; this.list = list; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return 0; } @Override public View getView(int i, View view, ViewGroup viewGroup) { ViewHolder holder; if (view == null) { holder = new ViewHolder(); view = View.inflate(context, R.layout.item, null); holder.textView = view.findViewById(R.id.id_tv_title); view.setTag(holder); } else { holder = (ViewHolder) view.getTag(); } holder.textView.setText(list.get(i)); return view; } static class ViewHolder { TextView textView; } }
5.layout_list_header.xml
<?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">
<ImageView
android:id="@+id/iv_header"
android:layout_width="match_parent"
android:layout_height="200dp"
android:scaleType="centerCrop"
android:src="@mipmap/parallax_img" />
</LinearLayout>
OK 圖片隨意了