超简单的viewpage指示器
来源:互联网 发布:网络专线多少钱一年 编辑:程序博客网 时间:2024/05/19 16:04
原理 通过计算滑动距离,通过动画进行滑动。
直接上代码。
布局文件
通过RadioButton 加 viewpage
但是在RadioButton 的下面 我们新增了一个Imageview 来表示我们的指示器。
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <!-- <include layout="@layout/shenyou_title_shaixuan" /> --> <RelativeLayout android:id="@+id/my" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingTop="2dp" android:paddingBottom="5dp" android:background="#0FFF" > <RadioGroup android:id="@+id/ch_home_radio" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:gravity="center_vertical" android:orientation="horizontal" > <RadioButton android:id="@+id/remen" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:drawablePadding="2dp" android:background="#00000000" android:button="@null" android:ellipsize="marquee" android:gravity="center" android:checked="true" android:text="热门" android:textColor="#000000" android:textSize="@dimen/text_size4" /> <RadioButton android:id="@+id/tuijian" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:drawablePadding="2dp" android:background="#00000000" android:button="@null" android:ellipsize="marquee" android:gravity="center" android:text="推荐" android:textColor="#000000" android:textSize="@dimen/text_size4" /> <RadioButton android:id="@+id/xinren" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:drawablePadding="2dp" android:background="#00000000" android:button="@null" android:ellipsize="marquee" android:gravity="center" android:text="新人" android:textColor="#000000" android:textSize="@dimen/text_size4" /> </RadioGroup> </RelativeLayout> <LinearLayout android:gravity="bottom" android:layout_width="match_parent" android:layout_height="2dip" android:background="#FFF" android:orientation="vertical" > <ImageView android:id="@+id/cursor" android:layout_width="wrap_content" android:layout_height="2dip" android:scaleType="centerCrop" android:src="@drawable/cursor" /> <View android:id="@+id/view" android:layout_width="match_parent" android:layout_height="@dimen/line_size" android:background="@color/line_color" /> </LinearLayout> <android.support.v4.view.ViewPager android:id="@+id/vpager" android:layout_width="match_parent" android:layout_height="0dip" android:layout_weight="2" > </android.support.v4.view.ViewPager></LinearLayout>
Fragment文件
首先 InitViewPager();初始化我们的view和将子fragment放入
private void InitViewPager() {remen = (Button) findViewById(R.id.remen);tuijian = (Button)findViewById(R.id.tuijian);xinren = (Button) findViewById(R.id.xinren);remen.setOnClickListener(this);tuijian.setOnClickListener(this);xinren.setOnClickListener(this);viewPager = (ViewPager)findViewById(R.id.vpager);mReMenFragment = new YouShenReMenFragment();mTuiJianFragment = new YouShenTuiJianFragment();mXinRenFragment = new YouShenXinRenFragment();mFragmentList.add(mReMenFragment);// 热门mFragmentList.add(mTuiJianFragment);// 推荐mFragmentList.add(mXinRenFragment);// 新人mFragmentAdapter = new GameFragmentAdapter(getChildFragmentManager(),mFragmentList);viewPager.setAdapter(mFragmentAdapter);viewPager.setOffscreenPageLimit(1);viewPager.setCurrentItem(0);remen.setTextColor(0xffffa800);viewPager.setOnPageChangeListener(new MyOnPageChangeListener());}
private void setbutt(){ remen.setTextColor(page==0?0xffffa800:0xff000000); tuijian.setTextColor(page==1?0xffffa800:0xff000000); xinren.setTextColor(page==2?0xffffa800:0xff000000); }
@Overridepublic void onClick(View v) {XHLog.e("=====", "currIndex="+currIndex);onResume();switch (v.getId()) {case R.id.remen:page=0;break;case R.id.xinren:page=2;break;case R.id.tuijian:page=1;break;default:break;}viewPager.setCurrentItem(page);}
初始化动画和计算初始化
private int offset = 0;// 动绘图片偏移量private int currIndex = 0;// 当前页卡编号private int bmpW;// 动绘图片宽度
/** * 2 * 初始化动画,这个就是页卡滑动时,以下的横线也滑动的效果,在这里须要计算一些数据 */private void InitImageView() {imageView = (ImageView)findViewById(R.id.cursor);DisplayMetrics dm = new DisplayMetrics();getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);int screenW = dm.widthPixels;// 获取分辨率宽度LayoutParams para = imageView.getLayoutParams();para.width = screenW / 3;//设置分成几份imageView.setLayoutParams(para);bmpW = imageView.getWidth();offset = (screenW / 3 - bmpW) / 2;// 计算偏移量Matrix matrix = new Matrix();matrix.postTranslate(offset, 0);imageView.setImageMatrix(matrix);// 设置动画初始位置}
public class MyOnPageChangeListener implements OnPageChangeListener {@Overridepublic void onPageScrollStateChanged(int arg0) {}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageSelected(int arg0) {int one = offset * 2 + bmpW;// 页卡1 -> 页卡2 偏移量int two = one * 2;// 页卡1 -> 页卡3 偏移量Animation animation = new TranslateAnimation(one * currIndex, one* arg0, 0, 0);// 显然这个比較简洁,仅仅有一行代码。currIndex = arg0;animation.setFillAfter(true);// True:图片停在动画结束位置animation.setDuration(300);imageView.startAnimation(animation);page=arg0;setbutt();
这里的滑动模块是3个,如果超过3个怎么优化
@Overridepublic void onPageScrollStateChanged(int arg0) {// TODO Auto-generated method stub}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {// TODO Auto-generated method stub}@Overridepublic void onPageSelected(int arg0) {// TODO Auto-generated method stubanima(arg0);page = arg0;setbutt();}
anima()方法
private void anima(int arg0) {// TODO Auto-generated method stubAnimation animation = new TranslateAnimation(page * bmpw, arg0 * bmpw,0, 0);animation.setFillAfter(true);// True:图片停在动画结束位置animation.setDuration(300);game_fragment_select_line.startAnimation(animation);}
重写onResume()
@Overridepublic void onResume() {super.onResume();//页卡切换回来时让横线停留在切换时的位置if(currIndex==0&&mReMenFragment!=null)mReMenFragment.onResume();else if(currIndex==1&&mTuiJianFragment!=null)mTuiJianFragment.onResume();else if(mXinRenFragment!=null)mXinRenFragment.onResume();if(imageView==null)return;Animation animation = new TranslateAnimation((offset * 2 + bmpW)*currIndex, (offset * 2 + bmpW)*currIndex, 0, 0);// 显然这个比較简洁,仅仅有一行代码。animation.setFillAfter(true);// True:图片停在动画结束位置animation.setDuration(0);imageView.startAnimation(animation);}
重写onPause()
@Overridepublic void onPause() {// TODO Auto-generated method stubsuper.onPause();if(mFragmentList!=null&&mFragmentList.size()>page)mFragmentList.get(page).onPause();}
ok。
上完整代码
package com.qpp.V4Fragment;import java.util.ArrayList;import android.graphics.Matrix;import android.os.Bundle;import android.support.v4.app.Fragment;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import android.util.DisplayMetrics;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.View.OnClickListener;import android.view.ViewGroup.LayoutParams;import android.view.animation.Animation;import android.view.animation.TranslateAnimation;import android.widget.Button;import android.widget.ImageView;/* * 神游页面 * */public class SwimGodFragment extends Fragmentparent implements OnClickListener {private int offset = 0;// 动绘图片偏移量private int currIndex = 0;// 当前页卡编号private int bmpW;// 动绘图片宽度private ImageView imageView;// 动绘图片Button tuijian, remen, xinren;private ViewPager viewPager;private int page;private List<Fragment> mFragmentList = new ArrayList<Fragment>();private GameFragmentAdapter mFragmentAdapter;private YouShenReMenFragment mReMenFragment;private YouShenTuiJianFragment mTuiJianFragment;private YouShenXinRenFragment mXinRenFragment;private void InitViewPager() {viewPager = (ViewPager)findViewById(R.id.vpager);mReMenFragment = new YouShenReMenFragment();mTuiJianFragment = new YouShenTuiJianFragment();mXinRenFragment = new YouShenXinRenFragment();mFragmentList.add(mReMenFragment);// 热门mFragmentList.add(mTuiJianFragment);// 推荐mFragmentList.add(mXinRenFragment);// 新人mFragmentAdapter = new GameFragmentAdapter(getChildFragmentManager(),mFragmentList);viewPager.setAdapter(mFragmentAdapter);viewPager.setOffscreenPageLimit(1);viewPager.setCurrentItem(0);remen.setTextColor(0xffffa800);viewPager.setOnPageChangeListener(new MyOnPageChangeListener());}private void initPage() {remen = (Button) findViewById(R.id.remen);tuijian = (Button)findViewById(R.id.tuijian);xinren = (Button) findViewById(R.id.xinren);remen.setOnClickListener(this);tuijian.setOnClickListener(this);xinren.setOnClickListener(this);} private void setbutt(){ remen.setTextColor(page==0?0xffffa800:0xff000000); tuijian.setTextColor(page==1?0xffffa800:0xff000000); xinren.setTextColor(page==2?0xffffa800:0xff000000); }@Overridepublic void onClick(View v) {XHLog.e("=====", "currIndex="+currIndex);onResume();switch (v.getId()) {case R.id.remen:page=0;break;case R.id.xinren:page=2;break;case R.id.tuijian:page=1;break;default:break;}viewPager.setCurrentItem(page);//setbutt();}/** * 2 * 初始化动画,这个就是页卡滑动时,以下的横线也滑动的效果,在这里须要计算一些数据 3 */private void InitImageView() {imageView = (ImageView)findViewById(R.id.cursor);DisplayMetrics dm = new DisplayMetrics();getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);int screenW = dm.widthPixels;// 获取分辨率宽度LayoutParams para = imageView.getLayoutParams();para.width = screenW / 3;//设置分成几份imageView.setLayoutParams(para);bmpW = imageView.getWidth();offset = (screenW / 3 - bmpW) / 2;// 计算偏移量Matrix matrix = new Matrix();matrix.postTranslate(offset, 0);imageView.setImageMatrix(matrix);// 设置动画初始位置}public class MyOnPageChangeListener implements OnPageChangeListener {@Overridepublic void onPageScrollStateChanged(int arg0) {}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageSelected(int arg0) {int one = offset * 2 + bmpW;// 页卡1 -> 页卡2 偏移量int two = one * 2;// 页卡1 -> 页卡3 偏移量Animation animation = new TranslateAnimation(one * currIndex, one* arg0, 0, 0);// 显然这个比較简洁,仅仅有一行代码。currIndex = arg0;animation.setFillAfter(true);// True:图片停在动画结束位置animation.setDuration(300);imageView.startAnimation(animation);page=arg0;setbutt();}}@Overridepublic void onResume() {super.onResume();//页卡切换回来时让横线停留在切换时的位置if(currIndex==0&&mReMenFragment!=null)mReMenFragment.onResume();else if(currIndex==1&&mTuiJianFragment!=null)mTuiJianFragment.onResume();else if(mXinRenFragment!=null)mXinRenFragment.onResume();if(imageView==null)return;Animation animation = new TranslateAnimation((offset * 2 + bmpW)*currIndex, (offset * 2 + bmpW)*currIndex, 0, 0);// 显然这个比較简洁,仅仅有一行代码。animation.setFillAfter(true);// True:图片停在动画结束位置animation.setDuration(0);imageView.startAnimation(animation);}@Overridepublic View getView(LayoutInflater inflater) {// TODO Auto-generated method stubview = inflater.inflate(R.layout.shenyou_layout, null);initPage();InitViewPager();InitImageView();return view;}@Overridepublic void onPause() {// TODO Auto-generated method stubsuper.onPause();if(mFragmentList!=null&&mFragmentList.size()>page)mFragmentList.get(page).onPause();}@Overrideprotected void lazyLoad() {super.lazyLoad();// TODO Auto-generated method stub}}
0 0
- 超简单的viewpage指示器
- ViewPage指示器
- 基于viewPage实现的轮播图+指示器
- 超简单实现ViewPage引导页动画
- ViewPageIndctor,viewPage指示器效果
- ViewPage指示器_viewpageindicator
- 模仿微博ViewPage指示器滑动效果的自定义View
- Viewpage的简单实现轮播墙
- viewpage+fragment的简单实现
- Android简单的ViewPager指示器
- Android简单的ViewPager指示器
- Android自定义View之超简单圆形数字指示器
- Android中Viewpage+Fragment的简单实现
- TabLayout+ViewPage+Fragment简单使用的方法
- 指示器的简单封装和使用
- 简单实用的ViewPager指示器NavigationTabStrip
- Android 超简单音乐播放器(一)主界面嘛(fragment+ViewPage)(View Pager滑动)( 标题栏的隐藏和状态栏的改变)
- 超简单的ActionBar
- 基础篇章:React Native 之 TextInput 的讲解
- 【C#】45. Task ContinueWith 后续操作
- 查找最小的k个元素
- 【Leetcode】8. String to Integer (atoi)
- 3379 数据结构实验之查找七:线性之哈希表
- 超简单的viewpage指示器
- 161211
- 新人初探汽车电子——成长记录
- 图片选择器多选功能
- 深入JVM-垃圾收集器常用的GC参数
- 一些常用的命令(Ubuntu)
- IDEA2016注册码
- c语言函数知识点补充
- 完善的贪吃蛇思路与各个类需要放什么!