Android应用开发Android 仿支付宝城市服务栏目tab选择滑动子View效果
白羽 2019-03-12 来源 :网络 阅读 1767 评论 0

摘要:本文将带你了解Android应用开发Android 仿支付宝城市服务栏目tab选择滑动子View效果,希望本文对大家学Android有所帮助。

    本文将带你了解Android应用开发Android 仿支付宝城市服务栏目tab选择滑动子View效果,希望本文对大家学Android有所帮助。



Android应用开发Android 仿支付宝城市服务栏目tab选择滑动子View效果


一.   图示
    \
    支付宝效果
    \实现的效果
    二. 思路讲解
    TabLayout+ScrollView实现即可。每一个tab对应scrollview中包裹的一层布局,以上有4个tab,也就需要inflate   4个布局文件,用来表示每一层的样式内容。
   
    1.页面加载完毕后,记住每一层父布局在Screen中所要滑动至顶部的距离Distance;
   
    2.操作:
   
    a. 当点击tab时:滑动scrollview该层的距离Distance;
   
    b. 当滑动scrollview至对应的层时: 选定对应的tab。
   
    三. 代码
    1. 布局代码


    布局代码很简单,可能会有的疑问点有:
   
    a. wrapperFl是用来干啥的?
   
    b. ObservableScrollView又是个什么东西?
   
    (后面说明)
   
    2. 逻辑代码


 
    public class MainActivity extends AppCompatActivity implements   ObservableScrollView.ScrollViewListener {
        private static final String TAG =   MainActivity;
        private FrameLayout   wrapperFl;
        private TabLayout   tabLayout;
        private ObservableScrollView   scrollView;
        private LinearLayout   containerLl;
        private boolean   firstAlreadyInflated = true;
        private ViewGroup   firstFloorVg;
        private ViewGroup secondFloorVg;
        private ViewGroup   thirdFloorVg;
        private ViewGroup   fourthFloorVg;
        private int   secondFloorVgPositionDistance;//第二层滑动至顶部的距离
        private int   thirdFloorVgPositionDistance;
        private int   fourthFloorVgPositionDistance;
        private int currentPosition =   0;
        private boolean   tabInterceptTouchEventTag = true;//标志位,用来区分是点击了tab还是手动滑动scrollview
     
        @Override
        protected void onCreate(Bundle   savedInstanceState) {
              super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initViews();
            initListeners();
        }
     
        private void initViews() {
            wrapperFl = (FrameLayout)   findViewById(R.id.wrapperFl);
            tabLayout = (TabLayout)   findViewById(R.id.tabLayout);
            scrollView =   (ObservableScrollView) findViewById(R.id.scrollView);
            containerLl = (LinearLayout)   findViewById(R.id.containerLl);
            for (int i = 0; i < 4;   i++) {
                tabLayout.addTab(tabLayout.newTab().setText(tab   + (i + 1)));
            }
     
            firstFloorVg = (ViewGroup)   LayoutInflater.from(this).inflate(R.layout.item_floor_first, null);
            secondFloorVg = (ViewGroup)   LayoutInflater.from(this).inflate(R.layout.item_floor_second, null);
            thirdFloorVg = (ViewGroup)   LayoutInflater.from(this).inflate(R.layout.item_floor_third, null);
            fourthFloorVg = (ViewGroup)   LayoutInflater.from(this).inflate(R.layout.item_floor_fourth, null);
     
              containerLl.addView(firstFloorVg);
              containerLl.addView(secondFloorVg);
              containerLl.addView(thirdFloorVg);
              containerLl.addView(fourthFloorVg);
     
        }
     
        @Override
        public void   onWindowFocusChanged(boolean hasFocus) {
              super.onWindowFocusChanged(hasFocus);
            if (firstAlreadyInflated)   {//获取各层离screen顶部的位置以及计算滑动值相应顶部所需要的距离
                firstAlreadyInflated =   false;
                int[]   firstFloorVgPosition = new int[2];
                int[]   secondFloorVgPosition = new int[2];
                int[]   thirdFloorVgPosition = new int[2];
                int[]   fourthFloorVgPosition = new int[2];
                firstFloorVg.getLocationOnScreen(firstFloorVgPosition);
                  secondFloorVg.getLocationOnScreen(secondFloorVgPosition);
                  thirdFloorVg.getLocationOnScreen(thirdFloorVgPosition);
                  fourthFloorVg.getLocationOnScreen(fourthFloorVgPosition);
                int   firstFloorVgPositionAnchor = firstFloorVgPosition[1];
                int   secondFloorVgPositionAnchor = secondFloorVgPosition[1];
                int   thirdFloorVgPositionAnchor = thirdFloorVgPosition[1];
                int   fourthFloorVgPositionAnchor = fourthFloorVgPosition[1];
     
                Log.d(TAG, 第一层距离屏幕的距离是: +   firstFloorVgPosition[1]);
                Log.d(TAG, 第二层距离屏幕的距离是: +   secondFloorVgPosition[1]);
                Log.d(TAG, 第三层距离屏幕的距离是: +   thirdFloorVgPosition[1]);
                Log.d(TAG, 第四层距离屏幕的距离是: +   fourthFloorVgPosition[1]);
     
                  secondFloorVgPositionDistance = secondFloorVgPositionAnchor -   firstFloorVgPositionAnchor;
                  thirdFloorVgPositionDistance = thirdFloorVgPositionAnchor -   firstFloorVgPositionAnchor;
                fourthFloorVgPositionDistance   = fourthFloorVgPositionAnchor - firstFloorVgPositionAnchor;
            }
        }
     
         

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程