首页 > 学院 > 开发设计 > 正文

viewpger的clipChildren属性,弄一个立体图片显示器

2019-11-07 23:56:05
字体:
来源:转载
供稿:网友

废话不多说直接贴代码

1.要在viewpager和父类的xml属性中设置android:clipChildren="false"

 <RelativeLayout        android:id="@+id/lockgp_desktop_detail_viewpager_rl"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:clipChildren="false">        <com.flkeyguard.lockgp.widget.ClipViewPager            android:id="@+id/lockgp_desktop_detail_viewpager"            android:layout_width="200dp"            android:layout_height="200dp"            android:layout_centerInParent="true"            android:clipChildren="false"            android:overScrollMode="never" />    </RelativeLayout>2.
viewPager = (ClipViewPager) findViewById(R.id.lockgp_desktop_detail_viewpager);lockGpDeskTopDetailAdapter = new LockGpDeskTopDetailAdapter(this,PReviewList,mAsyncImageLoader,handler);viewPager.setAdapter(lockGpDeskTopDetailAdapter);viewPager.setOffscreenPageLimit(previewList.size());viewPager.setPageTransformer(true, new ScaleTransformer());动画如下

public class ScaleTransformer implements ViewPager.PageTransformer {        private static final float MIN_SCALE = 0.85f;        private static final float MIN_ALPHA = 0.5f;        @Override        public void transformPage(View page, float position) {            if (position < -1 || position > 1) {                page.setAlpha(MIN_ALPHA);                page.setScaleX(MIN_SCALE);                page.setScaleY(MIN_SCALE);            } else if (position <= 1) { // [-1,1]                float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));                if (position < 0) {                    float scaleX = 1 + 0.15f * position;                    Log.d("google_lenve_fb", "transformPage: scaleX:" + scaleX);                    page.setScaleX(scaleX);                    page.setScaleY(scaleX);                } else {                    float scaleX = 1 - 0.15f * position;                    page.setScaleX(scaleX);                    page.setScaleY(scaleX);                }                page.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA));            }        }    }重点:
lockGpDeskTopDetailAdapter = new LockGpDeskTopDetailAdapter(this,previewList,mAsyncImageLoader,handler);viewPager.setAdapter(lockGpDeskTopDetailAdapter);

数据一点要这样设置进去,不能用
lockGpDeskTopDetailAdapter.setData();然后刷新的方法,不然滑动动画会失效3.设置左右的viewpager可以点击,touch

首先让父类也就是viewpager的父类

viewpagerRl.setOnTouchListener(new View.OnTouchListener() {            @Override            public boolean onTouch(View v, MotionEvent event) {                return viewPager.dispatchTouchEvent(event);            }        });然后重写viewpager,我们这边取名为 ClipViewPager
public class ClipViewPager extends ViewPager {    public ClipViewPager(Context context) {        super(context);    }    public ClipViewPager(Context context, AttributeSet attrs) {        super(context, attrs);    }    @Override    public boolean dispatchTouchEvent(MotionEvent ev) {        if (ev.getAction() == MotionEvent.ACTION_UP) {            View view = viewOfClickOnScreen(ev);            if (view != null) {                setCurrentItem(indexOfChild(view));            }        }        return super.dispatchTouchEvent(ev);    }    /**     * @param ev     * @return     */    private View viewOfClickOnScreen(MotionEvent ev) {        int childCount = getChildCount();        int[] location = new int[2];        for (int i = 0; i < childCount; i++) {            View v = getChildAt(i);            v.getLocationOnScreen(location);            int minX = location[0];            int minY = getTop();            int maxX = location[0] + v.getWidth();            int maxY = getBottom();            float x = ev.getX();            float y = ev.getY();            if ((x > minX && x < maxX) && (y > minY && y < maxY)) {                return v;            }        }        return null;    }}

这样就可以了


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表