Android 之 分分钟打造XViewPagerIndicator指示器
2016-09-27 11:55
281 查看
直接上代码:
没什么可讲的,一般控件简单的封装了下
2。使用:
3。main.xml
效果图:
猛戳这里:eclipse点击下载
import java.util.ArrayList; import java.util.List; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; /** * * @author 作者:易皇星 * * @da2016年9月27日 时间: * * @toTODO 类描述: */ public class XViewPagerIndicator extends LinearLayout { private static final String TAG = "ViewPagerIndicator"; private Context context; private ViewPager mViewPager; private int COLOR_TEXT_NORMAL = 0xFF000000; private int COLOR_INDICATOR_COLOR = Color.RED; private String[] mTitles; // private int mTabCount; private float mTranslationX; private Paint mPaint = new Paint(); private int mTabWidth; private List<TextView> textViews = new ArrayList<TextView>(); // 装载TextView文本,用来切换字体颜色 public XViewPagerIndicator(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub this.context = context; mPaint.setColor(COLOR_INDICATOR_COLOR); mPaint.setStrokeWidth(9.0f); } public XViewPagerIndicator(Context context) { super(context); // TODO Auto-generated constructor stub this.context = context; } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { // TODO Auto-generated method stub super.onSizeChanged(w, h, oldw, oldh); mTabWidth = w / mTabCount; } /** * * @param indicatorColor 统一设置自己想要的颜色字体 */ public void setIndicatorColor(int indicatorColor) { this.COLOR_INDICATOR_COLOR = indicatorColor; if(null!=mPaint){ mPaint.setColor(indicatorColor); } } @Override protected void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); canvas.save(); canvas.translate(mTranslationX, getHeight() - 2); canvas.drawLine(0, 0, mTabWidth, 0, mPaint); canvas.restore(); } public void scroll(int position, float offset) { mTranslationX = getWidth() / mTabCount * (position + offset); invalidate(); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { return super.dispatchTouchEvent(ev); } /** * * @param titles * 当前ViewPagerIndicator 显示的内容 * @param viewPager * 当前viewPager */ public void setTitles(String[] titles, ViewPager viewPager) { mTitles = titles; this.mViewPager = viewPager; mTabCount = titles.length; generateTitleView(); setViewPagerOnPageChangeListener(); } private void setViewPagerOnPageChangeListener() { if (null != mViewPager) { mViewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { // TODO Auto-generated method stub } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // TODO Auto-generated method stub scroll(position, positionOffset); setCurrentTextColor(position); } @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } }); } } private void generateTitleView() { // TODO Auto-generated method stub if (getChildCount() > 0) this.removeAllViews(); final int count = mTitles.length; setWeightSum(count); for (int i = 0; i < count; i++) { TextView tv = new TextView(getContext()); LayoutParams lp = new LayoutParams(0, LayoutParams.MATCH_PARENT); lp.weight = 1; tv.setGravity(Gravity.CENTER); tv.setTextColor(COLOR_TEXT_NORMAL); tv.setText(mTitles[i]); tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16); tv.setLayoutParams(lp); // 事件监听 final int currentIndex = i; tv.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // Toast.makeText(context, mTitles[currentIndex].toString(), // Toast.LENGTH_SHORT).show(); if (null != mViewPager) { mViewPager.setCurrentItem(currentIndex); } else { Log.i(TAG, "请初始化Viewpager"); } } }); addView(tv); textViews.add(tv); } } /** * * * @param currentIndex * 设置当前ViewPager滑动时title的颜色 */ public void setCurrentTextColor(int currentIndex) { for (int i = 0; i < mTitles.length; i++) { if (textViews.get(i).equals(textViews.get(currentIndex))) { textViews.get(currentIndex).setTextColor(COLOR_INDICATOR_COLOR); } else { textViews.get(i).setTextColor(COLOR_TEXT_NORMAL); } } } }
没什么可讲的,一般控件简单的封装了下
2。使用:
import java.util.ArrayList; import java.util.List; import com.example.xviewpagerindicator.fragment.OneFragment; import com.example.xviewpagerindicator.fragment.ThreeFragment; import com.example.xviewpagerindicator.fragment.TwoFragment; import android.graphics.Color; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; public class MainActivity extends FragmentActivity { private XViewPagerIndicator mViewPagerindicator; private String[] titles = { "简介", "评价", "相关" }; private ViewPager viewPager; private List<Fragment> fragments = new ArrayList<Fragment>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fragments.add(new OneFragment()); fragments.add(new TwoFragment()); fragments.add(new ThreeFragment()); mViewPagerindicator = (XViewPagerIndicator) findViewById(R.id.id_stickynavlayout_indicator); mViewPagerindicator.setIndicatorColor(Color.BLUE); viewPager = (ViewPager) findViewById(R.id.id_stickynavlayout_viewpager); viewPager.setAdapter(new ViewPagerAdapter(getSupportFragmentManager())); mViewPagerindicator.setTitles(titles, viewPager); // mViewPagerindicator.setIndicatorColor(Color.GRAY); } class ViewPagerAdapter extends FragmentPagerAdapter { public ViewPagerAdapter(FragmentManager fm) { super(fm); // TODO Auto-generated constructor stub } @Override public int getCount() { // TODO Auto-generated method stub return fragments.size(); } @Override public Fragment getItem(int arg0) { // TODO Auto-generated method stub return fragments.get(arg0); } } }
3。main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <com.example.xviewpagerindicator.XViewPagerIndicator android:id="@+id/id_stickynavlayout_indicator" android:layout_width="match_parent" android:layout_height="50dp" > </com.example.xviewpagerindicator.XViewPagerIndicator> <android.support.v4.view.ViewPager android:id="@+id/id_stickynavlayout_viewpager" android:layout_width="match_parent" android:layout_height="match_parent" > </android.support.v4.view.ViewPager> </LinearLayout>
效果图:
猛戳这里:eclipse点击下载
相关文章推荐
- Android中实现静态的默认安装和卸载应用
- 解决android studio 无法连接逍遥模拟器的问题
- Android平板上开发应用的一点心得——精确适配不同的dpi和屏幕尺寸
- android自定义属性
- Android 开源项目源码解析 -->公共技术点之 Java 动态代理(五)
- 2016年最佳的15款Android黑科技工具你知道吗?
- Android 开源项目源码解析 -->公共技术点之 Java 注解 Annotation(四)
- Android实现相机拍摄、选择、图片裁剪功能
- Android 开源项目源码解析 -->公共技术点之 View 绘制流程(三)
- 【MDCC技术大咖秀】Android内存优化之OOM
- android之用户头像的获取和显示
- android自定义Toolbar
- Android AIDL分析
- Android LocationManager,报上你的经纬度!
- Android 图片模糊、高斯模糊、毛玻璃的三种实现方法
- Android开发过程中R文件消失,或者在类中通过R.layout无法找到我们想要的xml文件
- Android 图片毛玻璃的实现方法
- Android 开源项目源码解析 -->公共技术点之依赖注入(二)
- Android的常见控件(TextView、EditText、Button、Menu)使用
- Android 开源项目源码解析 -->公共技术点之 View 事件传递(一)