【Android】自己定义控件——仿天猫Indicator
今天来说说类似天猫的Banner中的小圆点是怎么做的(图中绿圈部分)
在学习自己定义控件之前,我用的是很二的方法,直接在布局中放入多个ImageView,然后代码中依据Pager切换来改变图片。这样的方法尽管能够在切换完毕后正确显示小圆点,可是却做不到例如以下图中的切换中的状态显示:
今天学到了自己定义控件,正好能够把这个坑填上。
说一下思路:
在ViewPager翻动的时候,会调用
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels);
当中positionOffset为翻动的百分比,所以仅仅要将这个參数传入自己定义控件,就能够计算出实心圆点的坐标
实战:
PagerIndicator.java
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 PagerIndicator extends View {
// 空心圆半径
private int RADIUS = 10;
// 空心圆画笔
private Paint mBgPaint;
// 实心圆画笔(当前页)
private Paint mPaint;
// 圆点个数,默觉得5,设计布局时能够预览
private int mCount = 5;
// 当前实心圆的位置
private int mPosition;
// 偏移量(百分比)
private float mOffset;
// 第一个空心圆的圆心坐标
private int startY;
private int startX; @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas); // 画出空心的小圆点
for (int i = 0; i < mCount; i++) {
canvas.drawCircle(startX + i * 3 * RADIUS, startY, RADIUS, mBgPaint);
} // 画出指示当前位置的原点,因为高度固定,所以仅仅计算了X坐标
float x = startX + (mPosition + mOffset) * 3 * RADIUS;
canvas.drawCircle(x, startY, RADIUS - 1, mPaint);
} @Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
// 获取第一个空心圆的圆心坐标
startX = w - 3 * RADIUS * mCount;
startY = h / 2;
super.onSizeChanged(w, h, oldw, oldh);
} // 设置圆个数
public void setCount(int count) {
mCount = count;
} // 获取偏移量并重绘indicator
public void onPageScrolled(int position, float offset) {
mPosition = position;
mOffset = offset;
invalidate();
} // 创建带AttributeSet參数的构造方法使控件能够直接拖动到布局中并预览
public PagerIndicator(Context context, AttributeSet attrs) {
super(context, attrs);
initPaint();
} // 初始化画笔
private void initPaint() {
// 空心圆画笔
mBgPaint = new Paint();
mBgPaint.setColor(Color.GRAY);
mBgPaint.setAntiAlias(true);
mBgPaint.setStyle(Paint.Style.STROKE);
mBgPaint.setStrokeWidth(2);
// 实心圆画笔
mPaint = new Paint();
mPaint.setColor(Color.rgb(197, 135, 87));
mPaint.setAntiAlias(true); } }
布局的设置:
XML:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="100dp" > <android.support.v4.view.ViewPager
android:id="@+id/banner_pager"
android:layout_width="match_parent"
android:layout_height="100dp"
android:background="#C0FFFF" /> <这里改成你自己的包名.PagerIndicator
android:id="@+id/pagerIndicate1"
android:layout_width="match_parent"
android:layout_height="20dp"
android:background="#C0C0C0"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true" /> </RelativeLayout>
在使用到的地方:
初始化的方法,反正仅仅要比使用早调用到即可
private void initPagerIndicator() {
mPagerIndicator = (PagerIndicator) mLayout.findViewById(R.id.pagerIndicate1);
//此处直接设置为7,有需求可自己更改成其它值
mPagerIndicator.setCount(7);
}
设置ViewPager监听器:
mPager.setOnPageChangeListener(new OnPageChangeListener() { @Override
public void onPageSelected(int arg0) {
} @Override
public void onPageScrolled(int position, float offset, int arg2) {
//重点在这里,调用控件内的方法
mPagerIndicator.onPageScrolled(position , offset);
} @Override
public void onPageScrollStateChanged(int arg0) {
}
});
完毕的效果:
颜色选得比較任意,认为难看自己换掉吧,毕竟我没有美工QAQ。。。
chenbw1
2014/5/8
欢迎转载,转载请注明出处,谢谢
最后吐槽下,原来CSDN有私信啊。。。之前全然就没注意过。。。所以一些信息如今才看到也就不回了,毕竟都过去好久了,抱歉啦。。。。。。。。。。。
【Android】自己定义控件——仿天猫Indicator的更多相关文章
- Android自己定义控件系列五:自己定义绚丽水波纹效果
尊重原创!转载请注明出处:http://blog.csdn.net/cyp331203/article/details/41114551 今天我们来利用Android自己定义控件实现一个比較有趣的效果 ...
- Android自己定义控件:进度条的四种实现方式
前三种实现方式代码出自: http://stormzhang.com/openandroid/2013/11/15/android-custom-loading/ (源代码下载)http://down ...
- android 自己定义控件
Android自己定义View实现非常easy 继承View,重写构造函数.onDraw.(onMeasure)等函数. 假设自己定义的View须要有自己定义的属性.须要在values下建立attrs ...
- Android自己定义控件皮肤
Android自己定义控件皮肤 对于Android的自带控件,其外观仅仅能说中规中矩,而我们平时所示Android应用中,一个简单的button都做得十分美观.甚至于很多button在按下时的外观都有 ...
- android 自己定义控件属性(TypedArray以及attrs解释)
近期在捣鼓android 自己定义控件属性,学到了TypedArray以及attrs.在这当中看了一篇大神博客Android 深入理解Android中的自己定义属性.我就更加深入学习力一番.我就沿着这 ...
- Android自己定义控件之应用程序首页轮播图
如今基本上大多数的Android应用程序的首页都有轮播图.就是像下图这种(此图为转载的一篇博文中的图.拿来直接用了): 像这种组件我相信大多数的应用程序都会使用到,本文就是自己定义一个这种组件,能够动 ...
- Android自己定义控件(状态提示图表)
[工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重分享成果] 1 背景 前面分析那么多系统源代码了.也该暂停下来歇息一下,趁昨晚闲着看见一个有意思的需求就操 ...
- Android自己定义控件系列二:自己定义开关button(一)
这一次我们将会实现一个完整纯粹的自己定义控件,而不是像之前的组合控件一样.拿系统的控件来实现.计划分为三部分:自己定义控件的基本部分,自己定义控件的触摸事件的处理和自己定义控件的自己定义属性: 以下就 ...
- Android 自己定义控件开发入门(二)
上一次我们讲了一堆实现自己定义控件的理论基础.列举了View类一些能够重写的方法,我们对这些方法的重写是我们继承View类来派生自己定义控件的关键 我通过一个最简单的样例给大家展示了这一个过程,不管是 ...
随机推荐
- Linux编程---I/O部分
非常多函数都能够在网上找到,也比較基础,所以原型仅仅给出了函数名.详细用到再man吧. 输入输出是个非常重要的一块内容.差点儿网络相关的东西基本都是靠底层IO调用来实现的. 好吧.还是先踏踏实实的介绍 ...
- Android 自定义view实现水波纹效果
http://blog.csdn.net/tianjian4592/article/details/44222565 在实际的开发中,很多时候还会遇到相对比较复杂的需求,比如产品妹纸或UI妹纸在哪看了 ...
- Js基础操作
var a="zhangsan"; document.write(a+":I love JavaScrip"); a="lisi"; doc ...
- 写一方法计算实现任意个整数之和.在主调函数中调用该函数,实现任意个数之和。(使用params参数)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- ubuntu使用postgist,pgrouting
安装过程 一 :所需组件1 PostgreSQL 9.4 or higher.2 Proj4 .reprojection library.3 GEOS .geometry library.4 LibX ...
- BZOJ 3282: Tree( LCT )
LCT.. -------------------------------------------------------------------------------- #include<c ...
- mysqldump 备份数据说明+ 避免锁表
1.mysqldump命令备份Mysql数据库的参数说明 在用mysqldump备份使用那些参数选项是最完美的组合呢?--skip-opt--create-option ...
- python中enumerate 函数
enumerate 函数用于遍历序列中的元素以及它们的下标: >>> for i,j in enumerate(('a','b','c')): print i,j 0 a 1 b ...
- CPU自制入门——笔记
最近在看日本人的那本书<CPU自制入门>就开始自己捣鼓.把工程方到QuartusII 里面后发现编译不通过,总是提示找不到头文件.工程的目录架构是这个样子的 而.v文件中的.h 是这么包含 ...
- 正态分布(Normal distribution)又名高斯分布(Gaussian distribution)
正态分布(Normal distribution)又名高斯分布(Gaussian distribution),是一个在数学.物理及project等领域都很重要的概率分布,在统计学的很多方面有着重大的影 ...