效果图如下:

ViewPager+Fragment添加一行若干小红球滚动指示器指示当前ViewPager翻阅位置(可供第三方使用的类)。

类似现在通用的新闻客户端头部,会放置几张图片供新闻阅读者翻阅,同时放置一行小圆球根据用户翻阅的位置相应的滚动,标识出当前第几页。

该项目开放出几个用以重载的方法函数供第三方使用:

protected Fragment getFragmentAt(int pos) {return null;}protected int getItemsCount() {return 0;}protected   String  getDescriptionAt(int pos){return    null;}

测试用的主MainActivity.java (不是重点,仅仅用以测试)

package zhangphil.viewpager_fragment;import java.util.ArrayList;
import java.util.Random;import com.example.viewpager_fragment.R;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.FragmentTransaction;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;public class MainActivity extends FragmentActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Fragment newFragment = new HowToUseThisView();FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();transaction.replace(R.id.fragment, newFragment);transaction.commit();}public static class HowToUseThisView extendsViewPagerAndFragmentWithCircleIndicator {private ArrayList<Fragment> mArrayList;// 主要用以标记Fragment,没特别意义private int id = 0;// ViewPager的元素个数。private int item_count = 0;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mArrayList = new ArrayList<Fragment>();// 测试用的。假设生成随机个数的Fragment。Random rand = new Random();item_count = rand.nextInt(10);}@Overrideprotected Fragment getFragmentAt(int pos) {Fragment fragment = null;try {fragment = mArrayList.get(pos);} catch (Exception e) {Log.d(this.getClass().getName(), "队列中不存在,创建新Fragment");}if (fragment == null) {fragment = new TestFragment();((TestFragment) fragment).setID(id++);mArrayList.add(fragment);}return fragment;}@Overrideprotected int getItemsCount() {return item_count;}@Overrideprotected String getDescriptionAt(int pos) {//实际使用过程中,可根据每个不同的Fragment返回不同的描述文本return pos + "";}}//// 仅仅用于测试的Fragment,在ViewPager中加载//public static class TestFragment extends Fragment {private int id = 0;public void setID(int id) {this.id = id;}public int getID() {return id;}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {TextView tv = new TextView(getActivity());String str = "序号: " + getID();tv.setTextColor(Color.LTGRAY);tv.setText(str);tv.setTextSize(60);tv.setGravity(Gravity.CENTER);return tv;}}
}

MainActivity.java所要的布局文件 activity_main.xml :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><FrameLayout android:id="@+id/fragment"  android:layout_width="match_parent"android:layout_height="match_parent">  </FrameLayout></LinearLayout>

重点是 ViewPagerAndFragmentWithCircleIndicator.java

package zhangphil.viewpager_fragment;import com.example.viewpager_fragment.R;import zhangphil.libs.view.CircleIndicatorView;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;public class ViewPagerAndFragmentWithCircleIndicator extends Fragment {private MyFragmentPagerAdapter mPagerAdapter;private ViewPager mViewPager;private CircleIndicatorView mCircleIndicatorView;private    TextView circleIndicatorView_TextView;private Handler handler;private final int MESSAGE_WHAT_DRAW_CIRCLE = 100;public void notifyDataSetChanged() {mPagerAdapter.notifyDataSetChanged();}protected Fragment getFragmentAt(int pos) {return null;}protected int getItemsCount() {return 0;}protected    String  getDescriptionAt(int pos){return    null;}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View mView = inflater.inflate(R.layout.viewpager_fragment, null);mViewPager = (ViewPager) mView.findViewById(R.id.viewpager);mPagerAdapter = new MyFragmentPagerAdapter(getFragmentManager());mViewPager.setAdapter(mPagerAdapter);mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {@Overridepublic void onPageSelected(int pos) {set(pos);}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageScrollStateChanged(int arg0) {}});mCircleIndicatorView = (CircleIndicatorView) mView.findViewById(R.id.circleIndicatorView);mCircleIndicatorView.drawCircleView(mPagerAdapter.getCount(), 0);//初始化红色小圆球的 位置和文本描述circleIndicatorView_TextView=(TextView) mView.findViewById(R.id.circleIndicatorView_TextView);circleIndicatorView_TextView.setText(getDescriptionAt(0));handler = new Handler() {public void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) {case MESSAGE_WHAT_DRAW_CIRCLE:mCircleIndicatorView.drawCircleView(mPagerAdapter.getCount(),mViewPager.getCurrentItem());break;}};};return mView;}private void set(int pos) {mViewPager.setCurrentItem(pos, true);circleIndicatorView_TextView.setText(getDescriptionAt(pos));handler.sendEmptyMessage(MESSAGE_WHAT_DRAW_CIRCLE);}private class MyFragmentPagerAdapter extends FragmentPagerAdapter {public MyFragmentPagerAdapter(FragmentManager fm) {super(fm);}@Overridepublic Fragment getItem(int pos) {return   getFragmentAt(pos);}@Overridepublic int getCount() {return getItemsCount();}@Overridepublic void notifyDataSetChanged() {super.notifyDataSetChanged();handler.sendEmptyMessage(MESSAGE_WHAT_DRAW_CIRCLE);}}
}

ViewPagerAndFragmentWithCircleIndicator.java需要的布局文件 viewpager_fragment.xml :

<?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" ><FrameLayout android:layout_weight="1"android:layout_width="match_parent"android:layout_height="match_parent" ><android.support.v4.view.ViewPagerandroid:id="@+id/viewpager"android:layout_width="match_parent"android:layout_height="match_parent" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="30dip"android:orientation="horizontal"android:layout_gravity="bottom" ><TextViewandroid:id="@+id/circleIndicatorView_TextView"android:layout_width="0dip"android:layout_height="match_parent"android:gravity="left"android:textColor="#FF0000"android:layout_weight="1"android:singleLine="true"android:text="" /><zhangphil.libs.view.CircleIndicatorViewandroid:id="@+id/circleIndicatorView"android:layout_width="0dip"android:layout_height="match_parent"android:layout_weight="0.382"/></LinearLayout></FrameLayout></LinearLayout>

以及用以绘制红色小圆球的 CircleIndicatorView.java

package zhangphil.libs.view;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;public class CircleIndicatorView extends View { public CircleIndicatorView(Context context, AttributeSet attrs){   super(context, attrs);  }private    int gap=20;//各个横向排列的小球间距public void    setCirlceGap(int gap){this.gap=gap;}public int getCirlceGap(){return   gap;}private    int padding=20;public  void    setPadding(int padding){this.padding=padding;}public   int getPadding(){return padding;}private    int circle_normal_radius=5; //普通小球半径public void    setNormalCircleRadius(int radius){this.circle_normal_radius=radius;}public int getNormalCircleRadius(){return  circle_normal_radius;}private   int circle_selected_radius=7; //被选择的小球半径public void setSelectedCircleRadius(int radius){this.circle_selected_radius=radius;} public   int getSelectedCircleRadius(){return    circle_selected_radius;}private int count=0;public void    setCircleCount(int count){this.count=count;}public int getCircleCount(){return count;}private  int pos=0;public   void    setCircleSelectedPosition(int pos){this.pos=pos;}public    int getCircleSelectedPosition(){return  pos;}public void    drawCircleView(){this.invalidate();}public  void    drawCircleView(int count,int circleSelectedPosition){setCircleCount(count);setCircleSelectedPosition(circleSelectedPosition);this.invalidate();}private int circleSelectedColor=Color.RED;public   void    setCircleSelectedColor(int color){circleSelectedColor=color;}public    int getCircleSelectedColor(){return circleSelectedColor;}private    int circleUnSelectedColor=Color.LTGRAY;public  void    setCircleUnSelectedColor(int color){circleUnSelectedColor=color;}public    int getCircleUnSelectedColor(){return   circleUnSelectedColor;}@Override  protected void onDraw(Canvas canvas) {  super.onDraw(canvas); Paint p = new Paint();  p.setAntiAlias(true);int w=this.getWidth();int h=this.getHeight();//因为是自右往左绘制小圆圈,需要转化pos的位置。int translate_pos=getCircleCount()-getCircleSelectedPosition()-1;//如果居中绘制则使用start_x,但需要依次递加x坐标轴位置值。//int start_x=(w-(CIRCLE_GAP*(getCircleCount()-1)))/2;for(int i=0;i<getCircleCount();i++){int r=getNormalCircleRadius();if(i==translate_pos){r=getSelectedCircleRadius();p.setColor(getCircleSelectedColor());}else{r=getNormalCircleRadius();p.setColor(getCircleUnSelectedColor()); }//自右向左绘制。从最右边往左边绘制小球//如果从该自定制的View左边绘制,直接将 x=0即可。canvas.drawCircle(w-i*getCirlceGap()-getPadding(), h/2, r, p);}}
}


ViewPager+Fragment添加一行若干小红球滚动指示器指示当前ViewPager翻阅位置(可供第三方使用的类)相关推荐

  1. TabLayout+Viewpager+Fragment实现分页滚动

    效果如上,顶部标签滚动底下的页面也跟着滚动 灰色的标签只是一个recyclerview装起来的 这里用TabLayout+Viewpager+Fragment实现 先看布局 <?xml vers ...

  2. 安卓开发之使用viewpager+fragment实现滚动tab页

    闲着.用viewpager+fragment实现了个滚动tab..轻拍,以后会陆续发先小东西出来..爱分享,才快乐.demo见附件.. Java代码   package com.example.dem ...

  3. ViewPager+Fragment实现TabHost,Fragment动态添加、删除,Tab选项卡跟随滑动

    效果图: 代码功能: (1)用ViewPager+Fragment实现TabHost,ViewPager的每一个Page均是Fragment.ViewPager中的Fragment可以动态添加.删除. ...

  4. android listview动态添加viewpager,向 ViewPager 中添加 包含 ListView 的 Fragment

    对与fragment就不说什么了,直接看API手册吧,亲. 向 ViewPager 中添加 包含 ListView 的 Fragment 的过程比较麻烦.他所表现的效果就是新闻客户端的滑动翻页效果. ...

  5. Android viewpager+fragment实现无限滚动,左右有前/后一页的部分,并fragment显示的内容是activity传过去的数据

    背景:最近在做app的时候碰到一个这样的需求.1,将从网络上获取的json数组数据显示出来,每页显示一个数据源,并且可以左右翻页查看:2,中间显示一个完整页,两边分别还有上下一页的一点,:3,可无限循 ...

  6. 如何同时倒放多段视频,并添加一行滚动字幕

    在剪辑视频素材时,一般我们会选择什么样的技巧去倒放视频,或者给视频添加一行滚动字幕呢?其实这样的效果不难实现,下面一起来试试. 需要哪些工具? 视频剪辑高手 多段视频素材 怎么快速剪辑? 在视频剪辑高 ...

  7. 拉项目--球球世道的总结-解决了viewpager+fragment+tablayout 两个bug

    一:立项 1,创新新的项目 2,引入module   (这些都是我自己项目整的) -----fragmentation -----fragmentation_swipeback -----uibase ...

  8. Android studio实现底部导航,Android 开发之BottomBar+ViewPager+Fragment实现炫酷的底部导航效果...

    BottomBar BottomBar是Github上的一个开源框架,因为从1.3.3开始不支持fragments了,要自己配置,弄了很久,不管是app的fragment还是V4 的程序总是总是闪退. ...

  9. Android ViewPager + Fragment的布局

    ViewPager And Fragment 1.之前有篇博客是讲ViewPager的用法的:http://www.cnblogs.com/liangstudyhome/p/3773156.html ...

最新文章

  1. 快速排序 python菜鸟教程-1.6 快速排序
  2. git切换路径报错:bash: cd: too many arguments
  3. 炸弹人游戏开发系列(6):实现碰撞检测,设置移动步长
  4. Keras和TensorFlow的关系和区别
  5. java解析xml中文字符乱码_各种Java中文乱码的处理方法
  6. 天气数据获取接口和网址汇总
  7. emacs java自动import,在Java模式如何我配置Emacs,这样就不会自动对齐方法参数
  8. lwip路由实现_TCP超时与重传《LwIP协议栈源码详解——TCP/IP协议的实现》
  9. POJ 3262 Protecting the Flowers 贪心(性价比)
  10. Linq To Entity 的分页讨论
  11. es 在数据量数亿级别提高查询效率?
  12. jdbc.postgresql源码分析
  13. 卡巴斯基提供升级包 解决病毒库升级
  14. AD20 mill与mm转换
  15. js将两张图片合成一张图片
  16. STM32CubeMX配置读取MLX90614(GY-906)非接触红外测温传感器
  17. 基于Arch GNU/Linux的简体中文live系统 archlive
  18. 只需5秒,赶走阴冷寒风,迎来温暖热浪,云米对流电暖器体验
  19. php微信零钱明细,微信钱包的收支记录明细在哪里查看,看完就明白了
  20. 分组、分类(分组汇总)

热门文章

  1. 计算机认知矫正发展史,计算机认知矫正疗法对儿童认知功能的影响.pdf
  2. 剑灵系统推荐加点_《剑灵》各职业练级推荐修炼加点攻略
  3. 【渝粤题库】广东开放大学 文化创意学 形成性考核
  4. Hyperledger Fabric 超级账本 区块链技术 概述 优点
  5. 让犯罪有迹可寻,区块链存证被最高人民法院认可
  6. [IOS APP]小豆子幽默丛书
  7. Qt FFmpeg视频播放器开发(二):FFmepg基本使用与视频播放
  8. 解决运行qmake:Project ERROR: Cannot run compiler ‘cl‘. Output:
  9. 统计中的f检验和t检验的区别
  10. 音视频入门之如何绘制一张图片