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

废话不多说直接贴代码

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;
    }
}

这样就可以了




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值