【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类来派生自己定义控件的关键 我通过一个最简单的样例给大家展示了这一个过程,不管是 ...
随机推荐
- Android编程获取网络连接状态(3G/Wifi)及调用网络配置界面
随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityManager 类,用 ...
- 55. 略谈Lotus Notes的与众不同及系列文章至此的总结
在二十多年的悠久历史里,Lotus Notes发展出一整套独特的概念.技术和思维.由于它早期惊人的领先时代和后续发展中同样惊人的忠于传统,这位软件领域的寿星在如今发展更新速度远超往日和技术愈趋公开互通 ...
- c/c++内存分配方式(转)
原文链接:http://blog.csdn.net/jing0611/article/details/4030237 1.内存分配方式 内存分配方式有三种: [1]从静态存储区域分配.内存在 程序编译 ...
- z-index要同级比较,absolute包含块外有overflow-hidden
z-index只能在position属性值为relative或absolute或fixed的元素上有效. z-index只决定同一父元素中的同级子元素的堆叠顺序. position:absolute ...
- 应用程序无法正常启动0xc000007b
参考: http://jingyan.baidu.com/article/ff42efa9181bbbc19e22022f.html DirectX修复工具: http://blog.csdn.net ...
- SDCard助手类
package com.zyh.sdcardHelper; import java.io.BufferedInputStream; import java.io.BufferedOutputStrea ...
- 另一种数据库连接字符串的编写方式(Sqlbuilder)
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(); builder.DataSource = "&q ...
- BZOJ 1025: [SCOI2009]游戏( 背包dp )
显然题目要求长度为n的置换中各个循环长度的lcm有多少种情况. 判断一个数m是否是满足题意的lcm. m = ∏ piai, 当∑piai ≤ n时是满足题意的. 最简单我们令循环长度分别为piai, ...
- OJ双人赛:程序设计竞赛的新尝试
早就想在所教的班上组织一次程序设计竞赛,直到冒出双人赛形式的念头.出题.分组.竞赛,又是一次新的尝试. 做为在教学环节中组织的竞赛,不同于自愿报名的竞赛,必须全员参与.享受比赛要追求,培养团队意识也要 ...
- asp.net 通过 Handler 导出数据至excel (让用户下载)
效果图: 代码: Export2Excel.ashx <%@ WebHandler Language="C#" CodeBehind="Export2Excel.a ...