1. 程式人生 > >Android CV系列 > 圖片視差特效

Android CV系列 > 圖片視差特效

由於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 圖片隨意了