HorizontalScrollView和ViewPager联动效果
来源:互联网 发布:绵阳科技城软件产业园 编辑:程序博客网 时间:2024/05/22 07:58
以下代码为网上下载的,经测试可以运行,我只是加了一些注释,供大家参考
完整代码,可以到我的资源里下载
MainActivity
/** * HorizontalScrollView和ViewPager联动效果 上面为HorizontalScrollView,下面为ViewPager * * @author zj 2012-5-23 下午1:07:06 */public class MainActivity extends Activity implements OnCheckedChangeListener { private RadioGroup mRadioGroup; private RadioButton mRadioButton1; private RadioButton mRadioButton2; private RadioButton mRadioButton3; private RadioButton mRadioButton4; private RadioButton mRadioButton5; private ImageView mImageView; private float mCurrentCheckedRadioLeft;// 当前被选中的RadioButton距离左侧的距离 private HorizontalScrollView mHorizontalScrollView;// 上面的水平滚动控件 private ViewPager mViewPager; // 下方的可横向拖动的控件 private ArrayList<View> mViews;// 用来存放下方滚动的layout(layout_1,layout_2,layout_3) @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); iniController(); iniListener(); iniVariable(); mRadioButton1.setChecked(true);// 默认让第一个按钮被选中 mViewPager.setCurrentItem(1);// 默认让第一个ViewPager被选中 mCurrentCheckedRadioLeft = getCurrentCheckedRadioLeft();// 得到当前选中的按钮距离最左边的距离 } private void iniVariable() { // TODO Auto-generated method stub mViews = new ArrayList<View>();// 这里设置了第0和第7页为空界面,是为了实现划到最左或者最右,有一个可以划出空白页面但是不会停留的效果,其实不要这种效果也行 mViews.add(getLayoutInflater().inflate(R.layout.layout_0, null)); mViews.add(getLayoutInflater().inflate(R.layout.layout_1, null)); mViews.add(getLayoutInflater().inflate(R.layout.layout_2, null)); mViews.add(getLayoutInflater().inflate(R.layout.layout_3, null)); mViews.add(getLayoutInflater().inflate(R.layout.layout_4, null)); mViews.add(getLayoutInflater().inflate(R.layout.layout_5, null)); mViews.add(getLayoutInflater().inflate(R.layout.layout_0, null)); mViewPager.setAdapter(new MyPagerAdapter());// 设置ViewPager的适配器 } /** * RadioGroup点击CheckedChanged监听 */ @Override public void onCheckedChanged(RadioGroup group, int checkedId) { AnimationSet _AnimationSet = new AnimationSet(true); TranslateAnimation _TranslateAnimation; Log.i("zj", "checkedid=" + checkedId); if (checkedId == R.id.btn1) { // 让蓝色横条从点击前的位置滚动到点击后的位置,记得滚动完后要把当前位置设为mCurrentCheckedRadioLeft的值!!! _TranslateAnimation = new TranslateAnimation( mCurrentCheckedRadioLeft, getResources().getDimension( R.dimen.rdo1), 0f, 0f); _AnimationSet.addAnimation(_TranslateAnimation); _AnimationSet.setFillBefore(false);// 不让动画结束时回到初始状态 _AnimationSet.setFillAfter(true);// 让动画结束时保留在结束状态 _AnimationSet.setDuration(100); /* * LayoutParams _LayoutParams1 = new LayoutParams(100, 4); * _LayoutParams1.setMargins(0, 0, 0, 0); * _LayoutParams1.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); */ // mImageView.bringToFront(); mImageView.startAnimation(_AnimationSet);// 开始上面蓝色横条图片的动画切换 // mImageView.setLayoutParams(_LayoutParams1); mViewPager.setCurrentItem(1);// 让下方ViewPager跟随上面的HorizontalScrollView切换 } else if (checkedId == R.id.btn2) { _TranslateAnimation = new TranslateAnimation( mCurrentCheckedRadioLeft, getResources().getDimension( R.dimen.rdo2), 0f, 0f); _AnimationSet.addAnimation(_TranslateAnimation); _AnimationSet.setFillBefore(false); _AnimationSet.setFillAfter(true); _AnimationSet.setDuration(100); // mImageView.bringToFront(); mImageView.startAnimation(_AnimationSet); mViewPager.setCurrentItem(2); } else if (checkedId == R.id.btn3) { _TranslateAnimation = new TranslateAnimation( mCurrentCheckedRadioLeft, getResources().getDimension( R.dimen.rdo3), 0f, 0f); _AnimationSet.addAnimation(_TranslateAnimation); _AnimationSet.setFillBefore(false); _AnimationSet.setFillAfter(true); _AnimationSet.setDuration(100); // mImageView.bringToFront(); mImageView.startAnimation(_AnimationSet); mViewPager.setCurrentItem(3); } else if (checkedId == R.id.btn4) { _TranslateAnimation = new TranslateAnimation( mCurrentCheckedRadioLeft, getResources().getDimension( R.dimen.rdo4), 0f, 0f); _AnimationSet.addAnimation(_TranslateAnimation); _AnimationSet.setFillBefore(false); _AnimationSet.setFillAfter(true); _AnimationSet.setDuration(100); // mImageView.bringToFront(); mImageView.startAnimation(_AnimationSet); mViewPager.setCurrentItem(4); } else if (checkedId == R.id.btn5) { _TranslateAnimation = new TranslateAnimation( mCurrentCheckedRadioLeft, getResources().getDimension( R.dimen.rdo5), 0f, 0f); _AnimationSet.addAnimation(_TranslateAnimation); _AnimationSet.setFillBefore(false); _AnimationSet.setFillAfter(true); _AnimationSet.setDuration(100); // mImageView.bringToFront(); mImageView.startAnimation(_AnimationSet); mViewPager.setCurrentItem(5); } mCurrentCheckedRadioLeft = getCurrentCheckedRadioLeft();// 更新当前蓝色横条距离左边的距离 Log.i("zj", "getCurrentCheckedRadioLeft=" + getCurrentCheckedRadioLeft()); Log.i("zj", "getDimension=" + getResources().getDimension(R.dimen.rdo2)); // 让ScrollBar自动跟随点击的button位置而变动,否则你点击到最右侧了,右侧的条目不会自动显示出来,还要手动滑动ScrollBar // 后面跟的x,y坐标,可以自己测试来给出,比如这里当你点击第1、2个按钮时x=-1、0,这里不可能存在负数,-1按0计,ScrollBar在最左侧即可,当你点击第3/4/5按钮时,ScrollBar适当右移100/200/300 mHorizontalScrollView.smoothScrollTo((int) mCurrentCheckedRadioLeft - (int) getResources().getDimension(R.dimen.rdo2), 0); } /** * 获得当前被选中的RadioButton距离左侧的距离 */ private float getCurrentCheckedRadioLeft() { // TODO Auto-generated method stub if (mRadioButton1.isChecked()) { // Log.i("zj", // "currentCheckedRadioLeft="+getResources().getDimension(R.dimen.rdo1)); return getResources().getDimension(R.dimen.rdo1); } else if (mRadioButton2.isChecked()) { // Log.i("zj", // "currentCheckedRadioLeft="+getResources().getDimension(R.dimen.rdo2)); return getResources().getDimension(R.dimen.rdo2); } else if (mRadioButton3.isChecked()) { // Log.i("zj", // "currentCheckedRadioLeft="+getResources().getDimension(R.dimen.rdo3)); return getResources().getDimension(R.dimen.rdo3); } else if (mRadioButton4.isChecked()) { // Log.i("zj", // "currentCheckedRadioLeft="+getResources().getDimension(R.dimen.rdo4)); return getResources().getDimension(R.dimen.rdo4); } else if (mRadioButton5.isChecked()) { // Log.i("zj", // "currentCheckedRadioLeft="+getResources().getDimension(R.dimen.rdo5)); return getResources().getDimension(R.dimen.rdo5); } return 0f; } private void iniListener() { // TODO Auto-generated method stub mRadioGroup.setOnCheckedChangeListener(this); mViewPager.setOnPageChangeListener(new MyPagerOnPageChangeListener()); } private void iniController() { // TODO Auto-generated method stub mRadioGroup = (RadioGroup) findViewById(R.id.radioGroup); mRadioButton1 = (RadioButton) findViewById(R.id.btn1); mRadioButton2 = (RadioButton) findViewById(R.id.btn2); mRadioButton3 = (RadioButton) findViewById(R.id.btn3); mRadioButton4 = (RadioButton) findViewById(R.id.btn4); mRadioButton5 = (RadioButton) findViewById(R.id.btn5); mImageView = (ImageView) findViewById(R.id.img1); mHorizontalScrollView = (HorizontalScrollView) findViewById(R.id.horizontalScrollView); mViewPager = (ViewPager) findViewById(R.id.pager); } /** * ViewPager的适配器 * * @author zj 2012-5-24 下午2:26:57 */ private class MyPagerAdapter extends PagerAdapter { @Override public void destroyItem(View v, int position, Object obj) { // TODO Auto-generated method stub ((ViewPager) v).removeView(mViews.get(position)); } @Override public void finishUpdate(View arg0) { // TODO Auto-generated method stub } @Override public int getCount() { // TODO Auto-generated method stub return mViews.size(); } @Override public Object instantiateItem(View v, int position) { ((ViewPager) v).addView(mViews.get(position)); return mViews.get(position); } @Override public boolean isViewFromObject(View arg0, Object arg1) { // TODO Auto-generated method stub return arg0 == arg1; } @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { // TODO Auto-generated method stub } @Override public Parcelable saveState() { // TODO Auto-generated method stub return null; } @Override public void startUpdate(View arg0) { // TODO Auto-generated method stub } } /** * ViewPager的PageChangeListener(页面改变的监听器) * * @author zj 2012-5-24 下午3:14:27 */ private class MyPagerOnPageChangeListener implements OnPageChangeListener { @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 } /** * ★别忘了!!!滑动ViewPager的时候,让上方的HorizontalScrollView自动切换 */ @Override public void onPageSelected(int position) { // TODO Auto-generated method stub // Log.i("zj", "position="+position); if (position == 0) { // 必须是写setCurrentItem(1),上边设置的是radiogroup的选择改变监听事件,而不是点击事件 // 你预先点击performClick,并不会实现把页面切回到A页面的操作 mViewPager.setCurrentItem(1); // mRadioButton1.performClick(); } else if (position == 1) { mRadioButton1.performClick(); } else if (position == 2) { mRadioButton2.performClick(); } else if (position == 3) { mRadioButton3.performClick(); } else if (position == 4) { mRadioButton4.performClick(); } else if (position == 5) { mRadioButton5.performClick(); } else if (position == 6) { mViewPager.setCurrentItem(5); // mRadioButton5.performClick(); } } }}
布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <HorizontalScrollView android:layout_width="match_parent" android:layout_height="50dp" android:fadingEdge="@null" android:scrollbars="none" android:background="#555555" android:id="@+id/horizontalScrollView" > <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="#33b5e5" > <RadioGroup android:id="@+id/radioGroup" android:layout_width="fill_parent" android:layout_height="49dp" android:orientation="horizontal" android:layout_alignParentTop="true" > <RadioButton style="@style/radioButton" android:text="one" android:id="@+id/btn1" /> <RadioButton style="@style/radioButton" android:text="two" android:id="@+id/btn2" /> <RadioButton style="@style/radioButton" android:text="three" android:id="@+id/btn3" /> <RadioButton style="@style/radioButton" android:text="four" android:id="@+id/btn4" /> <RadioButton style="@style/radioButton" android:text="five" android:id="@+id/btn5" /> </RadioGroup> <ImageView android:id="@+id/img1" android:layout_width="100dp" android:layout_height="4dp" android:background="#33b5e5" android:layout_alignParentBottom="true" /> </RelativeLayout> </HorizontalScrollView> <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="fill_parent" android:layout_height="fill_parent" /></LinearLayout>
item
layout_0
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/darker_gray"></LinearLayout>
layout_1
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/darker_gray"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="A" android:gravity="center" android:textSize="240sp" android:textColor="#33b5e5" /></LinearLayout>
styles
同样的设置可以抽取为一个样式,增强代码的复用性
<?xml version="1.0" encoding="utf-8"?><resources> <style name="radioButton"> <item name="android:layout_width">100dp</item> <item name="android:layout_height">fill_parent</item> <item name="android:layout_weight">1.0</item> <item name="android:padding">10dp</item> <item name="android:gravity">center</item> <item name="android:background">@drawable/radiobtn_selector</item> <item name="android:button">@null</item> </style></resources>
dimens
<?xml version="1.0" encoding="utf-8"?><resources> <dimen name="rdo1">0dp</dimen> <dimen name="rdo2">100dp</dimen> <dimen name="rdo3">200dp</dimen> <dimen name="rdo4">300dp</dimen> <dimen name="rdo5">400dp</dimen></resources>
效果
0 0
- HorizontalScrollView和ViewPager联动效果
- 导航栏联动效果( HorizontalScrollView+ViewPager)
- 使用HorizontalScrollView和ViewPager联动效果出现的position值改变问题
- HorizontalScrollView与ViewPager联动
- HorizontalScrollView 使用 实现textview和viewpager的联动
- 标签—PagerSlidingTabStrip和ViewPager联动效果
- RadioGroup 和 ViewPager 实现联动效果
- TabLayout和ViewPager的联动效果实现
- HorizontalScrollView Horizontal水平滑动栏和今日头条ViewPager的联动
- ViewPager和Fragment结合,利用(HorizontalScrollView)实现指示器与ViewPager同时滑动的动态效果
- HorizontalScrollView和ViewPager的使用
- Android重写HorizontalScrollView模仿ViewPager效果
- android中HorizontalScrollView实现viewpager的效果
- 自定义HorizontalScrollView视图实现仿ViewPager效果
- 仿网易客户端的viewpager和头部的联动效果
- TabLayout和ViewPager实现联动效果以及Pulltorefresh
- TabLayout+ViewPager实现tab和页面联动效果
- ViewPager+Tablayout的联动效果
- arm下的led灯测试代码
- Snaker-flow介绍
- Cache技术――OSCache
- 【算法】直方图中最大面积问题
- 搜索引擎的设计与实现(一)从零开始?
- HorizontalScrollView和ViewPager联动效果
- VS2010下孙鑫《VC++深入详解》第15章网络聊天室程序的实现
- Android http实践 2015/06/19
- C语言指针的那些事(二)
- c malloc分配内存
- 可扩展Web架构与分布式系统
- UnityShader实例04:遮挡透明材质
- UIImage点击
- javascript使用bind()函数绑定this