ViewPager自定义指示条

一知半解的人,多不谦虚;见多识广有本领的人,一定谦虚。 —— 谢觉哉

重点内容
1、如何计算page指示器的偏移量?
2、动画的简单使用?
3、初始化动画位置?

**

1、计算指示器偏移量
①取得屏幕分辨率的宽度screenW
②取得指示器(图片)的宽度imageW
③偏移量offSet = (screenW/viewList.size()-imageW)/2
2、动画的简单使用
①指示器的偏移使用平移动画
②image设置动画:image.setAnimation(myAnimation)
3、初始化动画位置
①动画平移一个偏移量offSet

**

详细代码:

public class MainActivity extends Activity implements OnClickListener {

    private ArrayList<View> viewList;//装载view的List集合
    private View v1,v2,v3;//ViewPager子页面
    private LayoutInflater inflater;
    private ViewPager viewPager;
    private ImageView Img;//标题下方的图片,即指示器
    private TextView t1,t2,t3;//标题栏
    private int currentIndex = 0;//当前Pager的索引
    private float offSet;//偏移量
    private int imgW;//图片宽度
    public float ScreenW;//屏幕宽度

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initTextView();
        initViews();
        initAnimation();
        initPager();
    }

    /**
     * 初始动画
     */
    private void initAnimation() {
        //获取指示器的宽度,即获取资源文件中图片的宽度
        imgW = BitmapFactory.decodeResource(getResources(), R.drawable.a).getWidth();
        //获取屏幕分辨率的宽度
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        float ScreenW = dm.widthPixels;
        //指示器偏移量
        offSet = (ScreenW/viewList.size()-imgW)/2;
        //初始动画位置
        Matrix matrix = new Matrix();
        matrix.postTranslate(offSet, 0);
        Img.setImageMatrix(matrix);
    }

    /**
     * 初始化ViewPager
     */
    private void initPager() {
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        viewPager.setAdapter(new Myadapter(viewList));
        viewPager.setOnPageChangeListener(new MychangeListener());
    }

    /**
     * 自定义MychangeListener实现OnPageChangeListener接口
     * 用于ViewPager滑动监听
     */
    public class MychangeListener implements OnPageChangeListener{

        float one = offSet * 2 +imgW;//页卡一   --  页卡二的偏移量
        float two = one * 2;//页卡1  --  页卡三的偏移量

        @Override
        public void onPageScrollStateChanged(int arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onPageSelected(int arg0) {
            Animation animation = null;
            switch (arg0){
            //切换到索引为0的page页面
            case 0:
                //如果从索引为1的page页面切换
                if (currentIndex == 1){
                    //定义平移动画
                    animation = new TranslateAnimation(one, 0, 0, 0);
                }
                //如果从索引为2的page页面切换
                else if (currentIndex ==2){
                    animation = new TranslateAnimation(two, 0, 0, 0);
                }
                break;
            case 1:
                if (currentIndex == 0){
                    animation = new TranslateAnimation(0, one, 0, 0);
                }else if (currentIndex ==2){
                    animation = new TranslateAnimation(two, one, 0, 0);
                }
                break;
            case 2:
                if (currentIndex ==0){
                    animation = new TranslateAnimation(0, two, 0, 0);
                }else if (currentIndex == 1){
                    animation = new TranslateAnimation(one, two, 0, 0);
                }
                break;
            }
            //当前索引为切换后的page索引
            currentIndex = arg0 ;
            //动画停留在动画结束的位置
            animation.setFillAfter(true);
            animation.setDuration(300);
            //指示器设置动画
            Img.setAnimation(animation);
        }

    }

    /**
     * 自定义MyAdapter继承PagerAdapter
     * 1、构造函数中接受ViewList集合
     * 2、覆写PagerAdapter中的四个方法
     */
    public class Myadapter extends PagerAdapter{

        private ArrayList<View> viewlists;

        public Myadapter(ArrayList<View> list) {
            this.viewlists = list;
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return viewlists.size();
        }

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            // TODO Auto-generated method stub
            return arg0 == arg1;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            // TODO Auto-generated method stub
            container.removeView(viewlists.get(position));
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            // TODO Auto-generated method stub
            container.addView(viewlists.get(position));
            return viewlists.get(position);
        }

    }

    /**
     * 初始化Pager子页面,并将子页面装载到List集合中
     */
    private void initViews() {
        viewList = new ArrayList<View>();
        inflater = getLayoutInflater();
        v1 = inflater.inflate(R.layout.layout_1, null);
        v2 = inflater.inflate(R.layout.layout_2, null);
        v3 = inflater.inflate(R.layout.layout_3, null);
        viewList.add(v1);
        viewList.add(v2);
        viewList.add(v3);
    }

    /**
     * 初始化标题栏及指示器,
     */
    private void initTextView() {
        t1 = (TextView) findViewById(R.id.Tv_one);
        t2 = (TextView) findViewById(R.id.Tv_two);
        t3 = (TextView) findViewById(R.id.Tv_three);
        Img = (ImageView) findViewById(R.id.cursor);
        t1.setOnClickListener(this);
        t2.setOnClickListener(this);
        t3.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.Tv_one:
            viewPager.setCurrentItem(0);
            break;
        case R.id.Tv_two:
            viewPager.setCurrentItem(1);
            break;
        case R.id.Tv_three:
            viewPager.setCurrentItem(2);
            break;
        default:
            break;
        }
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 智慧社区背景与挑战 随着城市化的快速发展,社区面临健康、安全、邻里关系和服务质量等多方面的挑战。华为技术有限公司提出智慧社区解决方案,旨在通过先进的数字化技术应对这些问题,提升城市社区的生活质量。 2. 技术推动智慧社区发展 技术进步,特别是数字化、无线化、移动化和物联化,为城市社区的智慧化提供了可能。这些技术的应用不仅提高了社区的运行效率,也增强了居民的便利性和安全性。 3. 智慧社区的核心价值 智慧社区承载了智慧城市的核心价值,通过全面信息化处理,实现对城市各个方面的数字网络化管理、服务与决策功能,从而提升社会服务效率,整合社会服务资源。 4. 多层次、全方位的智慧社区服务 智慧社区通过构建和谐、温情、平安和健康四大社区模块,满足社区居民的多层次需求。这些服务模块包括社区医疗、安全监控、情感沟通和健康监测等。 5. 智慧社区技术框架 智慧社区技术框架强调统一平台的建设,设立数据中心,构建基础网络,并通过分层建设,实现平台能力及应用的可持续成长和扩展。 6. 感知统一平台与服务方案 感知统一平台是智慧社区的关键组成部分,通过统一的RFID身份识别和信息管理,实现社区服务的智能化和便捷化。同时,提供社区内外监控、紧急救助服务和便民服务等。 7. 健康社区的构建 健康社区模块专注于为居民提供健康管理服务,通过整合医疗资源和居民接入,实现远程医疗、慢性病管理和紧急救助等功能,推动医疗模式从治疗向预防转变。 8. 平安社区的安全保障 平安社区通过闭路电视监控、防盗报警和紧急求助等技术,保障社区居民的人身和财产安全,实现社区环境的实时监控和智能分析。 9. 温情社区的情感沟通 温情社区着重于建立社区居民间的情感联系,通过组织社区活动、一键呼叫服务和互帮互助平台,增强邻里间的交流和互助。 10. 和谐社区的资源整合 和谐社区作为社会资源的整合协调者,通过统一接入和身份识别,实现社区信息和服务的便捷获取,提升居民生活质量,促进社区和谐。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值