Android开发实战2----圆点导航指示器(使用自定义View实现)
来源:互联网 发布:pdf制作软件 编辑:程序博客网 时间:2024/06/15 07:34
一、项目概述
当我们使用viewpager进行图片预览时,底部一般情况都会出现圆点导航指示器,效果如图所示:
二、不好的一种处理方式:
刚开始的情况下,我们会现在activity中先定义一个LinearLayout,然后对于这个LinearLayout进行增删Imageview操作。比如:
@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);LayoutInflater inflater = getLayoutInflater();pageViews = new ArrayList<View>();pageViews.add(inflater.inflate(R.layout.viewpager01, null));pageViews.add(inflater.inflate(R.layout.viewpager02, null));pageViews.add(inflater.inflate(R.layout.viewpager03, null));pageViews.add(inflater.inflate(R.layout.viewpager04, null));pageViews.add(inflater.inflate(R.layout.viewpager05, null));pageViews.add(inflater.inflate(R.layout.viewpager06, null));// 小圆点数组,大小是图片的个数imageViews = new ImageView[pageViews.size()];// 从指定的XML文件中加载视图viewPictures = (ViewGroup) inflater.inflate(R.layout.viewpagers, null);viewPager = (ViewPager) viewPictures.findViewById(R.id.guidePagers);viewPoints = (ViewGroup) viewPictures.findViewById(R.id.viewPoints);// 添加小圆点导航的图片for (int i = 0; i < pageViews.size(); i++) {imageView = new ImageView(WhatsnewPagesA.this);imageView.setLayoutParams(new LayoutParams(20, 20));imageView.setPadding(5, 0, 5, 0);// 吧小圆点放进数组中imageViews[i] = imageView;// 默认选中的是第一张图片,此时第一个小圆点是选中状态,其他不是if (i == 0)imageViews[i].setImageDrawable(getResources().getDrawable(R.drawable.page_indicator_focused));elseimageViews[i].setImageDrawable(getResources().getDrawable(R.drawable.page_indicator_unfocused));// 将imageviews添加到小圆点视图组viewPoints.addView(imageViews[i]);}setContentView(viewPictures);viewPager.setAdapter(new NavigationPageAdapter());// 为viewpager添加监听,当view发生变化时的响应viewPager.setOnPageChangeListener(new NavigationPageChangeListener());}
三、改进的一种处理方式:
项目架构如下:
下面我们就采用自定义View的方式,把圆点导航指示器的显示代码,放到自定义视图(RoundNavigationIndicator)中
RoundNavigationIndicator.java文件如下:
package edu.njupt.javer.roundnavigationindicator.view;import edu.njupt.javer.roundnavigationindicator.R;import android.content.Context;import android.util.AttributeSet;import android.view.Gravity;import android.view.LayoutInflater;import android.widget.ImageView;import android.widget.LinearLayout;/** * @author yixiang *自定义圆点导航指示器 */public class RoundNavigationIndicator extends LinearLayout {private LinearLayout container;private int sum=0;private int selected=0;private Context context;public RoundNavigationIndicator(Context context) {super(context);this.context=context;init(context);}public RoundNavigationIndicator(Context context, AttributeSet attrs) {super(context, attrs);this.context=context;init(context);}private void init(Context context) {LayoutInflater.from(context).inflate(R.layout.image_navigation_indicaor_layout, this);setOrientation(LinearLayout.HORIZONTAL);setGravity(Gravity.CENTER_VERTICAL);container=(LinearLayout) findViewById(R.id.indicator);}//设置圆点总数public void setLenght(int sum){this.sum=sum;}//设置选中圆点的下标public void setSelected(int selected){container.removeAllViews();this.selected=selected;}//绘制指示器public void draw(){for(int i=0;i<sum;i++){ImageView imageview=new ImageView(context);imageview.setLayoutParams(new LayoutParams(20, 20));imageview.setPadding(5, 0, 5, 0);if(i==selected){imageview.setImageDrawable(getResources().getDrawable(R.drawable.page_indicator_focused));}else{imageview.setImageDrawable(getResources().getDrawable(R.drawable.page_indicator_unfocused));}container.addView(imageview);}}}
然后我们在布局文件中(activity_main.xml)导入我们的自定义视图(RoundNavigationIndicator),方法如下:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/dark" > <android.support.v4.view.ViewPagerandroid:id="@+id/pager"android:layout_width="match_parent"android:layout_height="match_parent"/> <edu.njupt.javer.roundnavigationindicator.view.RoundNavigationIndicator android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/indicator" android:layout_marginBottom="20dp" android:layout_gravity="bottom|center_horizontal" /></FrameLayout>
最后我们要在activity中对自定义视图(RoundNavigationIndicator)设置其自定义属性。
代码如下:
package edu.njupt.javer.roundnavigationindicator;import edu.njupt.javer.roundnavigationindicator.view.RoundNavigationIndicator;import android.app.Activity;import android.os.Bundle;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;public class MainActivity extends Activity {private int[] imageUrls={R.drawable.mm1,R.drawable.mm2,R.drawable.mm3,R.drawable.mm4};private RoundNavigationIndicator indicator;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//初始化圆点导航指示器indicator=(RoundNavigationIndicator) findViewById(R.id.indicator);indicator.setLenght(imageUrls.length);indicator.setSelected(0);indicator.draw();ViewPager pager=(ViewPager) findViewById(R.id.pager);pager.setAdapter(new MyPagerAdapter());pager.setOnPageChangeListener(new OnPageChangeListener() {@Overridepublic void onPageSelected(int position) {//根据viewpager的改变修正圆点导航指示器indicator.setSelected(position);indicator.draw();}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageScrollStateChanged(int arg0) {}});}class MyPagerAdapter extends PagerAdapter{private LayoutInflater inflater;public MyPagerAdapter() {inflater=LayoutInflater.from(getApplicationContext());}@Overridepublic int getCount() {return imageUrls.length;}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0.equals(arg1);}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {container.removeView((View)object);}@Overridepublic Object instantiateItem(ViewGroup container, int position) {View imageLayout = inflater.inflate(R.layout.item_pager_image, container, false);ImageView imageview=(ImageView) imageLayout.findViewById(R.id.image);imageview.setImageResource(imageUrls[position]);container.addView(imageLayout);return imageLayout;}}}
四、Demo下载地址
点击打开链接
0 0
- Android开发实战2----圆点导航指示器(使用自定义View实现)
- Android 自定义控件之圆点指示器 View (IndicateDotView)
- 自定义View和属性动画ValueAnimator实现圆点指示器
- 自定义Android圆点指示器
- Android 自定义View实现ViewPager指示器
- 【顶部导航】Android自定义指示器实现顶部导航(三角形,线,bitmap指示器),Fragment与ViewPager的组合。
- 自定义View和属性动画ValueAnimator实现圆点指示器——支持“纵向视图”
- Android 通讯录(2)-----自定义View实现右侧导航栏
- 自定义view实现ViewPager指示器
- 自定义view实现ViewPageIndicator(viewpage指示器) so easy
- Android自定义view之ViewPager指示器——2
- android 自定义View开发实战(四) 圆角矩形ImageView实现
- 自定义View实现顶部Tab指示器
- android 自定义View弯曲滑竿指示器
- Android自定义View--Flyme6的Viewpager指示器
- android 自定义View开发实战(一) CustomTitleView
- android 自定义View开发实战(二) CustomCircleView
- 【Android界面实现】带有指示器的自定义底部导航栏的实现
- ARM处理器模式介绍和模式切换
- 标签切换实现
- cmd数据库连接
- Visual C++内存泄露检测—VLD工具使用说明
- phpcms本地安装图文教程
- Android开发实战2----圆点导航指示器(使用自定义View实现)
- 数据库学习--Mysql字符串截取函数SUBSTRING的用法说明
- Matrix Admin html5网站管理后台源码 Bootstrap响应式模板主题
- 非正常结束weblogic进程导致weblogic无法启动
- restful RESTful的理解
- 动态代理:JDK动态代理和CGLIB代理的区别
- Android OTA 升级之二:脚本 ota_from_target_files
- Oracle plsql出参clob类型的操作
- Ace 1.3.1 网站管理后台源码 Bootstrap响应式模板主题