android 之 indicatorView的实现分析

本文介绍了Android编程中如何使用Paint对象的描边样式以及CircleIndicatorView的实现细节,包括抗锯齿设置、抖动效果、Canvas绘制小圆点中的文本,以及与ViewPager的交互。同时提到了一套全面的Android开发学习资料,涵盖基础知识到高级面试技巧和源码解析。
摘要由CSDN通过智能技术生成

Paint.Style.STROKE :描边

Paint还有其他属性:

setAntiAlias(boolean a) //设置抗锯齿,如果不设置,加载位图的时候可能会出现锯齿状的边界,如果设置,边界就会变的稍微有点模糊,锯齿就看不到了。

setDither(boolean dither) //设置是否抖动,如果不设置感觉就会有一些僵硬的线条,如果设置图像就会看的更柔和一些

protected void onDraw(Canvas canvas) {

for(int i=0;i<mIndicators.size();i++){

Indicator indicator = mIndicators.get(i);

float x = indicator.cx;

float y = indicator.cy;

if(mSelectPosition == i){//当前页

mCirclePaint.setStyle(Paint.Style.FILL);//填充

mCirclePaint.setColor(mSelectColor);//颜色可以再配置中自行设置

}else{

mCirclePaint.setColor(mDotNormalColor);

if(mFillMode != FillMode.NONE){//圆内非空

mCirclePaint.setStyle(Paint.Style.STROKE);//描边

}else{

mCirclePaint.setStyle(Paint.Style.FILL);

}

}

canvas.drawCircle(x,y, mRadius, mCirclePaint);

}

如果圆内有字母数字我们还需要再进行绘制,首先需要判断FillMode的值是什么,若为字母或数字则可进一步绘制,用Canvas来绘制文本需要给文本定位,我们借助Rect来获得文本的宽、高,Paint.getTextBounds用于获取文本的宽高,然后我们计算文本的开始位置,使文本居中:

// 绘制小圆点中的内容

if(mFillMode != FillMode.NONE){

String text = “”;

if(mFillMode == FillMode.LETTER){//圆内为字母

if(i >= 0 && i<LETTER.length){

text = LETTER[i];

}

}else{

text = String.valueOf(i+1);

}

Rect bound = new Rect();

mTextPaint.getTextBounds(text,0,text.length(),bound);//用于获取文本的宽高

int textWidth = bound.width();

int textHeight = bound.height();

float textStartX = x - textWidth / 2;

float textStartY = y + textHeight / 2;

canvas.drawText(text,textStartX,textStartY, mTextPaint);

}

}

还有一个细节,我们在点击相应的小圆点时会跳转到相应页面,我们来实现它:

@Override

public boolean onTouchEvent(MotionEvent event) {

float xPoint = 0;

float yPoint = 0;

switch (event.getAction()){

case MotionEvent.ACTION_DOWN:

xPoint = event.getX();

yPoint = event.getY();

handleActionDown(xPoint,yPoint);

break;

}

return super.onTouchEvent(event);

}

private void handleActionDown(float xDis,float yDis){

for(int i=0;i<mIndicators.size();i++){

Indicator indicator = mIndicators.get(i);

if(xDis < (indicator.cx + mRadius+mStrokeWidth)

&& xDis >=(indicator.cx - (mRadius + mStrokeWidth))

&& yDis >= (yDis - (indicator.cy+mStrokeWidth))

&& yDis <(indicator.cy+mRadius+mStrokeWidth)){

// 找到了点击的Indicator

// 是否允许切换ViewPager

if(mIsEnableClickSwitch){

mViewPager.setCurrentItem(i,false);

}

// 回调

if(mOnIndicatorClickListener!=null){

mOnIndicatorClickListener.onSelected(i);

}

break;

}

}

}

我们需要与ViewPaper配合使用,所有还需要一个与ViewPaper关联的方法,并在其中设置ViewPaper监听该View:

public void setUpWithViewPager(ViewPager viewPager){

releaseViewPager();

if(viewPager == null){

return;

}

mViewPager = viewPager;

mViewPager.addOnPageChangeListener(this);

int count = mViewPager.getAdapter().getCount();

setCount(count);

}

基本的已实现,那么我们来应用它,在xml文件中,我们可以在这里设置很多属性,这些属性对应着attr.xml中的内容:

<com.zhouwei.indicatorview.CircleIndicatorView

android:id=“@+id/indicator_view”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:layout_alignParentBottom=“true”

android:layout_marginBottom=“50dp”

android:layout_centerHorizontal=“true”

app:indicatorSelectColor=“#00A882”

app:fill_mode=“letter”

app:indicatorBorderWidth=“2dp”

app:indicatorRadius=“8dp”

app:indicatorColor=“@color/colorAccent”

app:indicatorTextColor=“@android:color/white”

/>

在activity中与ViewPaper关联:

mIndicatorView = (CircleIndicatorView) findViewById(R.id.indicator_view);

// 关联ViewPager

mIndicatorView.setUpWithViewPager(mViewPager);

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

面试复习笔记

这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

《960页Android开发笔记》

《1307页Android开发面试宝典》

包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

[外链图片转存中…(img-P2oXZAwc-1712515002694)]

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

[外链图片转存中…(img-bNXU9CxH-1712515002694)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值