Android自定义控件笔记

三种类型

1.继承现有的系统控件  2.继承View   3.继承ViewGroup

view和viewgroup最大的区别就是viewgroup是有孩子的,getChild()方法

ObjectAnimator 属性动画

ViewPager的高度一般要指定,要不然不显示

viewPager的适配器是继承PagerAdapter

instantiateItem多一步  container.addView(imageView);
class MyPagerAdapter extends PagerAdapter{

        @NonNull
        @Override
        public Object instantiateItem(@NonNull ViewGroup container, int position) {
            ImageView imageView = imageViews.get(position);
            container.addView(imageView);
            return imageView;
        }

        /**
         *
         * @param container  viewpager
         * @param position   释放的位置
         * @param object    释放的页面
         */
        @Override
        public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
//            super.destroyItem(container, position, object);
            container.removeView((View) object);
        }

        @Override
        public int getCount() {
            return imageViews.size();
        }

        /**
         * 判断view和o是否是同一个实例
         * @param view  页面
         * @param o
         * @return
         */
        @Override
        public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
//            if(view  == o){
//                return true;
//            }else {
//                return false;
//            }
            return view == o;
        }
    }

viewpager里面有一个方法监听滑动的位置,实现 OnPageChangeListener

 viewpager.addOnPageChangeListener(new MyOnPageChangeListener());
 class MyOnPageChangeListener implements ViewPager.OnPageChangeListener

viewPager左右无限滑动,去中间值,设置它的值无限大即可。

 //设置中间位置
        int item = Integer.MAX_VALUE / 2 - Integer.MAX_VALUE/2%imageViews.size();  //要保证是imageViews的整数倍
        viewpager.setCurrentItem(item);

@Override
        public int getCount() {
            return Integer.MAX_VALUE;
        }

radioGroup点击跳转的方法

 public void scrollToPager(int tempIndex) {
        if ((tempIndex < 0)) {
            tempIndex = 0;
        }
        if (tempIndex > getChildCount() - 1) {
            tempIndex = getChildCount() - 1;
        }
        currentIndex = tempIndex;
        float distanceX = currentIndex * getWidth() - getScrollX();
//        scrollTo(currentIndex * getWidth(),0);
        scrlloer.startScroll(getScrollX(), getScrollY(), (int) distanceX, 0);

        invalidate();  //onDraw() computeScroll() 执行
    }

点击事件(自定义接口)

1.定义接口  那里有变化,在那里定义

 /**
     * 监听页面改变的接口
     */
    public interface OnPagerChangeListener {
        /**
         * 页面改变回调这个方法
         *
         * @param position 当前页面下标
         */
        void onScrollToPager(int position);
    }

2.调用方法

private OnPagerChangeListener mOnPagerChangeListener;

    /**
     * 设置页面改变的监听
     *
     * @param l
     */
    public void setOnPagerChangeListener(OnPagerChangeListener l) {
        mOnPagerChangeListener = l;
    }

3.用户使用

view.setOnClickListener(new View.OnCLickListener()){}

rg_main.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            /**
             *
             * @param radioGroup
             * @param i  0到5
             */
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int i) {
                myviewpager.scrollToPager(i);
            }
        });

4.回调

view.setOnClickListener(new View.OnCLickListener()){   //点击事件被执行

}

 //设置页面改变
        myviewpager.setOnPagerChangeListener(new MyViewPager.OnPagerChangeListener() {
            /**
             * 0---5
             * @param position 当前页面下标
             */
            @Override
            public void onScrollToPager(int position) {
                rg_main.check(position);
            }
        });

scrollTo()是正值  从右到左

是负值  从左到右

invalidate() 这个方法是强制绘制 ondraw() computerScroll()方法 

在view弹出一层,实现方式  帧布局和relativeLayout布局

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值