热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

App引导页的实现带圆点指示器

项目中经常会用到引导页,鉴于此。今天把项目上用到的一些自定义控件给拆了,然后来写一些demo目的是强化这方面的知识,先看图再来看代码。首先编写attrs文件代码如下:<res

项目中经常会用到引导页,鉴于此。
今天把项目上用到的一些自定义控件给拆了,然后来写一些demo目的是强化这方面的知识,先看图

这里写图片描述

这里写图片描述

再来看代码。
首先编写attrs文件代码如下:

<resources>

<declare-styleable name="DotIndicator">
<attr name="distance" format="dimension" />
declare-styleable>
resources>

distance为圆点间的距离

实现类DotIndicator 继承LinearLayout

public class DotIndicator extends LinearLayout implements ViewPager.OnPageChangeListener {
private static final int DEFAULT_DISTANCE = 6;
private int oldPosition = -1;
private int distance = 0;

private ViewPager viewPager;

public DotIndicator(Context context) {
this(context, null);
}

public DotIndicator(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

public DotIndicator(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.DotIndicator);
distance = array.getDimensionPixelSize(R.styleable.DotIndicator_distance,
UIUtill.dp2px(context, DEFAULT_DISTANCE));
array.recycle();
init();
}

private void init() {
// 设置横向
setOrientation(LinearLayout.HORIZONTAL);
if (!(getLayoutParams() instanceof FrameLayout.LayoutParams)) {
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
params.gravity = Gravity.BOTTOM | Gravity.START;
setLayoutParams(params);
}
}

/**
* 关联viewPager 并注册监听
* @param viewPager
*/

public void setViewPager(ViewPager viewPager) {
this.viewPager = viewPager;
viewPager.addOnPageChangeListener(this);
if (viewPager != null) {
setDotIndicator(viewPager.getAdapter().getCount(),getContext());
}
}

/**
* 设置圆点指示器
* @param count
* @param context
*/

private void setDotIndicator(int count, Context context) {
removeIndicator();
if (count <= 0) {
return;
}
for (int i = 0; i ImageView iView = new ImageView(context);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
params.leftMargin = distance;
params.rightMargin = distance;
iView.setImageResource(R.drawable.dot_stroke);
addView(iView, params);
}
notifyIndicator(viewPager.getCurrentItem());

}

/**
* 移除指示器
*/

private void removeIndicator() {
removeAllViews();
}

/**
* 通知更新圆点指示器
* @param currentPosition
*/

private void notifyIndicator(int currentPosition) {
if (oldPosition != currentPosition){
if (oldPosition == -1){
((ImageView)getChildAt(currentPosition)).setImageResource(R.drawable.dot_solid);
oldPosition = currentPosition;
return;
}
((ImageView)getChildAt(oldPosition)).setImageResource(R.drawable.dot_stroke);
((ImageView)getChildAt(currentPosition)).setImageResource(R.drawable.dot_solid);
oldPosition = currentPosition;
}
}

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

}

@Override
public void onPageSelected(int position) {
notifyIndicator(position);
}

@Override
public void onPageScrollStateChanged(int state) {

}
}

这里用到的utill工具类为

public class UIUtill {
public static int dp2px(Context context, int dpValue) {
return (int) context.getResources().getDisplayMetrics().density * dpValue;
}
}

其中R.drawable.dot_stroke 在drawable文件下为shape实现代码如下

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">

<size android:width="10dp"
android:height="10dp"/>

<stroke android:width="1dp" android:color="@color/colorAccent"/>
shape>

R.drawable.dot_solid 为

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
<size
android:width="11dp"
android:height="11dp"/>

<stroke
android:width="1dp"
android:color="@color/colorAccent"
android:dashWidth="2dp"/>

<solid android:color="@android:color/white"/>
shape>

接下来再看activity_main.xml实现

"http://schemas.android.com/apk/res/android"
xmlns:gao="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_hljs-string">"match_parent"
android:layout_hljs-string">"match_parent"
tools:cOntext="com.example.ui.testdotindicator.MainActivity">


.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_hljs-string">"match_parent"
android:layout_hljs-string">"match_parent"/>

<com.example.ui.widget.DotIndicator
android:id="@+id/dot_indicator"
android:layout_hljs-string">"wrap_content"
android:layout_hljs-string">"wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizOntal="true"
android:gravity="center_vertical"
android:layout_marginBottom="40dp"
gao:distance="8dp"/>

最后看MainActivity实现

public class MainActivity extends AppCompatActivity{

private ViewPager viewPager;
private DotIndicator dotIndicator;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}


private void initView() {
viewPager = (ViewPager) findViewById(R.id.view_pager);
dotIndicator = (DotIndicator) findViewById(R.id.dot_indicator);
DotPagerAdapter adapter = new DotPagerAdapter(this);
viewPager.setAdapter(adapter);

dotIndicator.setViewPager(viewPager);

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

}

@Override
public void onPageSelected(int position) {
Toast.makeText(MainActivity.this,"position:"+position,Toast.LENGTH_SHORT).show();
}

@Override
public void onPageScrollStateChanged(int state) {

}
});
}
}

DotPagerAdapter的实现如下:

public class DotPagerAdapter extends PagerAdapter {
private List datas = new ArrayList<>();

public DotPagerAdapter(Context c) {

for (int i = 0; i <5; i ++){
ImageView iView = new ImageView(c);
iView.setImageResource(R.mipmap.a5);
iView.setScaleType(ImageView.ScaleType.FIT_XY);
datas.add(iView);
}
}

@Override
public int getCount() {
return datas.size();
}

@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(datas.get(position));
// super.destroyItem(container, position, object);
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(datas.get(position));
return datas.get(position);
}
}

总结:在项目的第一次加载中我们经常看到引导页,本例即是通过引导页为需求实现的关联viewPager的圆点指示器。
demo链接


推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 标题: ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
author-avatar
手机用户2502875747
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有