zoukankan      html  css  js  c++  java
  • Android导航菜单横向左右滑动并和下方的控件实现联动

    这个是美团网个人订单的效果,找了很多地方都没找到,自己研究了两天终于弄出来了^_^,有什么问题希望大家指出来,谢谢。

     

    实现原理是上方使用HorizontalScrollView这个可以水平横向拖动的控件,在其中加入了5个RadioButton;下方使用的是ViewPager,里面加入了7个Layout文件,其中第一个和最后一个为空,是为了实现拖到第一个屏幕的时候还能往外拖动的效果。

     

    先看下效果,切换都是带动画效果的,并且点击上面最右边的标签时会自动滚动出后面的标签。


    现在看一下代码:

    Java代码  收藏代码
    1. package com.zj.horizontalsrollview;  
    2.   
    3. import java.util.ArrayList;  
    4.   
    5. import android.app.Activity;  
    6. import android.os.Bundle;  
    7. import android.os.Parcelable;  
    8. import android.support.v4.view.PagerAdapter;  
    9. import android.support.v4.view.ViewPager;  
    10. import android.support.v4.view.ViewPager.OnPageChangeListener;  
    11. import android.util.Log;  
    12. import android.view.View;  
    13. import android.view.View.OnClickListener;  
    14. import android.view.ViewGroup.MarginLayoutParams;  
    15. import android.view.animation.Animation;  
    16. import android.view.animation.AnimationSet;  
    17. import android.view.animation.AnimationUtils;  
    18. import android.view.animation.TranslateAnimation;  
    19. import android.widget.HorizontalScrollView;  
    20. import android.widget.ImageView;  
    21. import android.widget.RadioButton;  
    22. import android.widget.RadioGroup;  
    23. import android.widget.RadioGroup.OnCheckedChangeListener;  
    24. import android.widget.RelativeLayout;  
    25. import android.widget.RelativeLayout.LayoutParams;  
    26. /** 
    27.  * HorizontalScrollView和ViewPager联动效果 
    28.  * 上面为HorizontalScrollView,下面为ViewPager 
    29.  * @author zj 
    30.  * 2012-5-23 下午1:07:06 
    31.  */  
    32. public class MainActivity extends Activity implements OnCheckedChangeListener{  
    33.     private RadioGroup mRadioGroup;  
    34.     private RadioButton mRadioButton1;  
    35.     private RadioButton mRadioButton2;  
    36.     private RadioButton mRadioButton3;  
    37.     private RadioButton mRadioButton4;  
    38.     private RadioButton mRadioButton5;  
    39.     private ImageView mImageView;  
    40.     private float mCurrentCheckedRadioLeft;//当前被选中的RadioButton距离左侧的距离  
    41.     private HorizontalScrollView mHorizontalScrollView;//上面的水平滚动控件  
    42.     private ViewPager mViewPager;   //下方的可横向拖动的控件  
    43.     private ArrayList<View> mViews;//用来存放下方滚动的layout(layout_1,layout_2,layout_3)  
    44.     @Override  
    45.     public void onCreate(Bundle savedInstanceState) {  
    46.         super.onCreate(savedInstanceState);  
    47.         setContentView(R.layout.main);  
    48.           
    49.         iniController();  
    50.         iniListener();  
    51.         iniVariable();  
    52.           
    53.         mRadioButton1.setChecked(true);  
    54.         mViewPager.setCurrentItem(1);  
    55.         mCurrentCheckedRadioLeft = getCurrentCheckedRadioLeft();  
    56.           
    57.     }  
    58.       
    59.     private void iniVariable() {  
    60.         // TODO Auto-generated method stub  
    61.         mViews = new ArrayList<View>();  
    62.         mViews.add(getLayoutInflater().inflate(R.layout.layout_0, null));  
    63.         mViews.add(getLayoutInflater().inflate(R.layout.layout_1, null));  
    64.         mViews.add(getLayoutInflater().inflate(R.layout.layout_2, null));  
    65.         mViews.add(getLayoutInflater().inflate(R.layout.layout_3, null));  
    66.         mViews.add(getLayoutInflater().inflate(R.layout.layout_4, null));  
    67.         mViews.add(getLayoutInflater().inflate(R.layout.layout_5, null));  
    68.         mViews.add(getLayoutInflater().inflate(R.layout.layout_0, null));  
    69.           
    70.         mViewPager.setAdapter(new MyPagerAdapter());//设置ViewPager的适配器  
    71.     }  
    72.       
    73.     /** 
    74.      * RadioGroup点击CheckedChanged监听 
    75.      */  
    76.     @Override  
    77.     public void onCheckedChanged(RadioGroup group, int checkedId) {  
    78.           
    79.         AnimationSet _AnimationSet = new AnimationSet(true);  
    80.         TranslateAnimation _TranslateAnimation;  
    81.           
    82.         Log.i("zj", "checkedid=" checkedId);  
    83.         if (checkedId == R.id.btn1) {  
    84.             _TranslateAnimation = new TranslateAnimation(mCurrentCheckedRadioLeft, getResources().getDimension(R.dimen.rdo1), 0f, 0f);  
    85.             _AnimationSet.addAnimation(_TranslateAnimation);  
    86.             _AnimationSet.setFillBefore(false);  
    87.             _AnimationSet.setFillAfter(true);  
    88.             _AnimationSet.setDuration(100);  
    89.             /*LayoutParams _LayoutParams1 = new LayoutParams(100, 4); 
    90.             _LayoutParams1.setMargins(0, 0, 0, 0); 
    91.             _LayoutParams1.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);*/  
    92.             //mImageView.bringToFront();  
    93.             mImageView.startAnimation(_AnimationSet);//开始上面蓝色横条图片的动画切换  
    94.             //mImageView.setLayoutParams(_LayoutParams1);  
    95.             mViewPager.setCurrentItem(1);//让下方ViewPager跟随上面的HorizontalScrollView切换  
    96.         }else if (checkedId == R.id.btn2) {  
    97.             _TranslateAnimation = new TranslateAnimation(mCurrentCheckedRadioLeft, getResources().getDimension(R.dimen.rdo2), 0f, 0f);  
    98.   
    99.             _AnimationSet.addAnimation(_TranslateAnimation);  
    100.             _AnimationSet.setFillBefore(false);  
    101.             _AnimationSet.setFillAfter(true);  
    102.             _AnimationSet.setDuration(100);  
    103.   
    104.             //mImageView.bringToFront();  
    105.             mImageView.startAnimation(_AnimationSet);  
    106.               
    107.             mViewPager.setCurrentItem(2);  
    108.         }else if (checkedId == R.id.btn3) {  
    109.             _TranslateAnimation = new TranslateAnimation(mCurrentCheckedRadioLeft, getResources().getDimension(R.dimen.rdo3), 0f, 0f);  
    110.               
    111.             _AnimationSet.addAnimation(_TranslateAnimation);  
    112.             _AnimationSet.setFillBefore(false);  
    113.             _AnimationSet.setFillAfter(true);  
    114.             _AnimationSet.setDuration(100);  
    115.               
    116.             //mImageView.bringToFront();  
    117.             mImageView.startAnimation(_AnimationSet);  
    118.               
    119.             mViewPager.setCurrentItem(3);  
    120.         }else if (checkedId == R.id.btn4) {  
    121.             _TranslateAnimation = new TranslateAnimation(mCurrentCheckedRadioLeft, getResources().getDimension(R.dimen.rdo4), 0f, 0f);  
    122.               
    123.             _AnimationSet.addAnimation(_TranslateAnimation);  
    124.             _AnimationSet.setFillBefore(false);  
    125.             _AnimationSet.setFillAfter(true);  
    126.             _AnimationSet.setDuration(100);  
    127.               
    128.             //mImageView.bringToFront();  
    129.             mImageView.startAnimation(_AnimationSet);  
    130.             mViewPager.setCurrentItem(4);  
    131.         }else if (checkedId == R.id.btn5) {  
    132.             _TranslateAnimation = new TranslateAnimation(mCurrentCheckedRadioLeft, getResources().getDimension(R.dimen.rdo5), 0f, 0f);  
    133.               
    134.             _AnimationSet.addAnimation(_TranslateAnimation);  
    135.             _AnimationSet.setFillBefore(false);  
    136.             _AnimationSet.setFillAfter(true);  
    137.             _AnimationSet.setDuration(100);  
    138.               
    139.             //mImageView.bringToFront();  
    140.             mImageView.startAnimation(_AnimationSet);  
    141.               
    142.             mViewPager.setCurrentItem(5);  
    143.         }  
    144.           
    145.         mCurrentCheckedRadioLeft = getCurrentCheckedRadioLeft();  
    146.           
    147.         Log.i("zj", "getCurrentCheckedRadioLeft=" getCurrentCheckedRadioLeft());  
    148.         Log.i("zj", "getDimension=" getResources().getDimension(R.dimen.rdo2));  
    149.           
    150.         mHorizontalScrollView.smoothScrollTo((int)mCurrentCheckedRadioLeft-(int)getResources().getDimension(R.dimen.rdo2), 0);  
    151.     }  
    152.       
    153.     /** 
    154.      * 获得当前被选中的RadioButton距离左侧的距离 
    155.      */  
    156.     private float getCurrentCheckedRadioLeft() {  
    157.         // TODO Auto-generated method stub  
    158.         if (mRadioButton1.isChecked()) {  
    159.             //Log.i("zj", "currentCheckedRadioLeft=" getResources().getDimension(R.dimen.rdo1));  
    160.             return getResources().getDimension(R.dimen.rdo1);  
    161.         }else if (mRadioButton2.isChecked()) {  
    162.             //Log.i("zj", "currentCheckedRadioLeft=" getResources().getDimension(R.dimen.rdo2));  
    163.             return getResources().getDimension(R.dimen.rdo2);  
    164.         }else if (mRadioButton3.isChecked()) {  
    165.             //Log.i("zj", "currentCheckedRadioLeft=" getResources().getDimension(R.dimen.rdo3));  
    166.             return getResources().getDimension(R.dimen.rdo3);  
    167.         }else if (mRadioButton4.isChecked()) {  
    168.             //Log.i("zj", "currentCheckedRadioLeft=" getResources().getDimension(R.dimen.rdo4));  
    169.             return getResources().getDimension(R.dimen.rdo4);  
    170.         }else if (mRadioButton5.isChecked()) {  
    171.             //Log.i("zj", "currentCheckedRadioLeft=" getResources().getDimension(R.dimen.rdo5));  
    172.             return getResources().getDimension(R.dimen.rdo5);  
    173.         }  
    174.         return 0f;  
    175.     }  
    176.   
    177.     private void iniListener() {  
    178.         // TODO Auto-generated method stub  
    179.           
    180.         mRadioGroup.setOnCheckedChangeListener(this);  
    181.           
    182.           
    183.         mViewPager.setOnPageChangeListener(new MyPagerOnPageChangeListener());  
    184.     }  
    185.   
    186.     private void iniController() {  
    187.         // TODO Auto-generated method stub  
    188.         mRadioGroup = (RadioGroup)findViewById(R.id.radioGroup);  
    189.         mRadioButton1 = (RadioButton)findViewById(R.id.btn1);  
    190.         mRadioButton2 = (RadioButton)findViewById(R.id.btn2);  
    191.         mRadioButton3 = (RadioButton)findViewById(R.id.btn3);  
    192.         mRadioButton4 = (RadioButton)findViewById(R.id.btn4);  
    193.         mRadioButton5 = (RadioButton)findViewById(R.id.btn5);  
    194.           
    195.         mImageView = (ImageView)findViewById(R.id.img1);  
    196.           
    197.         mHorizontalScrollView = (HorizontalScrollView)findViewById(R.id.horizontalScrollView);  
    198.           
    199.         mViewPager = (ViewPager)findViewById(R.id.pager);  
    200.     }  
    201.   
    202.     /** 
    203.      * ViewPager的适配器 
    204.      * @author zj 
    205.      * 2012-5-24 下午2:26:57 
    206.      */  
    207.     private class MyPagerAdapter extends PagerAdapter{  
    208.   
    209.         @Override  
    210.         public void destroyItem(View v, int position, Object obj) {  
    211.             // TODO Auto-generated method stub  
    212.             ((ViewPager)v).removeView(mViews.get(position));  
    213.         }  
    214.   
    215.         @Override  
    216.         public void finishUpdate(View arg0) {  
    217.             // TODO Auto-generated method stub  
    218.               
    219.         }  
    220.   
    221.         @Override  
    222.         public int getCount() {  
    223.             // TODO Auto-generated method stub  
    224.             return mViews.size();  
    225.         }  
    226.   
    227.         @Override  
    228.         public Object instantiateItem(View v, int position) {  
    229.             ((ViewPager)v).addView(mViews.get(position));  
    230.             return mViews.get(position);  
    231.         }  
    232.   
    233.         @Override  
    234.         public boolean isViewFromObject(View arg0, Object arg1) {  
    235.             // TODO Auto-generated method stub  
    236.             return arg0 == arg1;  
    237.         }  
    238.   
    239.         @Override  
    240.         public void restoreState(Parcelable arg0, ClassLoader arg1) {  
    241.             // TODO Auto-generated method stub  
    242.               
    243.         }  
    244.   
    245.         @Override  
    246.         public Parcelable saveState() {  
    247.             // TODO Auto-generated method stub  
    248.             return null;  
    249.         }  
    250.   
    251.         @Override  
    252.         public void startUpdate(View arg0) {  
    253.             // TODO Auto-generated method stub  
    254.               
    255.         }  
    256.           
    257.     }  
    258.     /** 
    259.      * ViewPager的PageChangeListener(页面改变的监听器) 
    260.      * @author zj 
    261.      * 2012-5-24 下午3:14:27 
    262.      */  
    263.     private class MyPagerOnPageChangeListener implements OnPageChangeListener{  
    264.   
    265.         @Override  
    266.         public void onPageScrollStateChanged(int arg0) {  
    267.             // TODO Auto-generated method stub  
    268.               
    269.         }  
    270.   
    271.         @Override  
    272.         public void onPageScrolled(int arg0, float arg1, int arg2) {  
    273.             // TODO Auto-generated method stub  
    274.               
    275.         }  
    276.         /** 
    277.          * 滑动ViewPager的时候,让上方的HorizontalScrollView自动切换 
    278.          */  
    279.         @Override  
    280.         public void onPageSelected(int position) {  
    281.             // TODO Auto-generated method stub  
    282.             //Log.i("zj", "position=" position);  
    283.               
    284.             if (position == 0) {  
    285.                 mViewPager.setCurrentItem(1);  
    286.             }else if (position == 1) {  
    287.                 mRadioButton1.performClick();  
    288.             }else if (position == 2) {  
    289.                 mRadioButton2.performClick();  
    290.             }else if (position == 3) {  
    291.                 mRadioButton3.performClick();  
    292.             }else if (position == 4) {  
    293.                 mRadioButton4.performClick();  
    294.             }else if (position == 5) {  
    295.                 mRadioButton5.performClick();  
    296.             }else if (position == 6) {  
    297.                 mViewPager.setCurrentItem(5);  
    298.             }  
    299.         }  
    300.           
    301.     }  
    302.       
    303. }  

     XML文件:

    Xml代码  收藏代码
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:orientation="vertical"  
    4.     android:layout_width="fill_parent"  
    5.     android:layout_height="fill_parent"  
    6.     >  
    7.     <HorizontalScrollView   
    8.         android:layout_width="match_parent"  
    9.         android:layout_height="50dp"  
    10.         android:fadingEdge="@null"  
    11.         android:scrollbars="none"  
    12.         android:background="#555555"  
    13.         android:id="@ id/horizontalScrollView"  
    14.     >  
    15.         <RelativeLayout   
    16.             android:layout_width="match_parent"  
    17.             android:layout_height="match_parent"  
    18.             android:background="#33b5e5"  
    19.         >  
    20.             <RadioGroup  
    21.                 android:id="@ id/radioGroup"  
    22.                 android:layout_width="fill_parent"  
    23.                 android:layout_height="49dp"  
    24.                 android:orientation="horizontal"  
    25.                 android:layout_alignParentTop="true"  
    26.             >  
    27.                 <RadioButton  
    28.                     style="@style/radioButton"  
    29.                     android:text="one"  
    30.                     android:id="@ id/btn1"  
    31.                 />  
    32.                 <RadioButton   
    33.                     style="@style/radioButton"  
    34.                     android:text="two"  
    35.                     android:id="@ id/btn2"  
    36.                 />  
    37.                 <RadioButton   
    38.                     style="@style/radioButton"  
    39.                     android:text="three"  
    40.                     android:id="@ id/btn3"  
    41.                 />  
    42.                 <RadioButton  
    43.                     style="@style/radioButton"  
    44.                     android:text="four"  
    45.                     android:id="@ id/btn4"  
    46.                 />  
    47.                 <RadioButton   
    48.                     style="@style/radioButton"  
    49.                     android:text="five"  
    50.                     android:id="@ id/btn5"  
    51.                 />  
    52.             </RadioGroup>  
    53.             <ImageView  
    54.                 android:id="@ id/img1"  
    55.                 android:layout_width="100dp"  
    56.                 android:layout_height="4dp"  
    57.                 android:background="#33b5e5"  
    58.                 android:layout_alignParentBottom="true"  
    59.             />  
    60.         </RelativeLayout>  
    61.     </HorizontalScrollView>  
    62.     <android.support.v4.view.ViewPager  
    63.         android:id="@ id/pager"  
    64.         android:layout_width="fill_parent"  
    65.         android:layout_height="fill_parent"  
    66.     />  
    67. </LinearLayout>  
  • 相关阅读:
    openssl自签发证书
    安装tomcat8 env
    路由信息相关 route 网卡
    安装jdk env
    sublime使用与配置
    docker仓库登录 配置insecure-registries
    harobor私有docker镜像仓库
    git版本回退的两种方式
    git diff命令的使用
    Kali Linux中的自带字典&crunch自建字典
  • 原文地址:https://www.cnblogs.com/android-blogs/p/4973775.html
Copyright © 2011-2022 走看看