android 点赞源码,android仿即刻点赞文字部分的自定义View的示例代码

概述:在学习HenCoder的过程中,有一期是模仿优秀自定义View,有一个项目是仿即刻的点赞,后来原作者在点评中提到,需要将文字和图片分开来写,并且模仿者的动画实现由点杂乱。所以决定重现实现下文字部分的效果。并拓展了更多功能。最后说一句本文基于kotlin实现。不明白的地方请在评论区指出。

即刻原效果:

de236a58fa8bb7221fb4215547390174.gif个人效果:

f683d12eb84975654e15498860f33c58.gif

分析

从效果图容易看出,图中的功能主要分为两个部分:

左侧大拇指动画

右侧的文字动画

拓展的功能包括:文字变换模式(全部和部分) 改变文字和未改变文字的间隔和颜色,文字始终位于中心位置。

一 文字的绘制

对文字绘制还不熟悉的同学请参考HenCoder系列文章,这里只对怎么实现居中的作一下说明。

1 水平居中

水平居中的绘制按文字变换模式分为两种

全部改变时:

控件宽度的一半减去文字宽度的一半 即是文字开始绘制的位置

canvas.drawText(array[1], width / 2.toFloat() - halfTextWidth(array[1]), baseLineY + yOffset, mPaint)

canvas.drawText(array[2], width / 2.toFloat() - halfTextWidth(array[2]), baseLineY + height / 2 + +halfOfTextHeight + yOffset, mPaint)

部分改变时

计算每部分文字起始位置

// 获取部分改变的模式时的绘制文字其实起始位置

startX = width / 2.toFloat() - (2 * halfTextWidth(array[0]) + mTextSpace + 2 * halfTextWidth(array[1])) / 2

mPaint.color = mNoChangeTextColor

canvas.drawText(array[0], startX, baseLineY, mPaint)

mPaint.color = mChangedTextColor

canvas.drawText(array[1], startX + 2 * halfTextWidth(array[0]) + mTextSpace, baseLineY + yOffset, mPaint)

canvas.drawText(array[2], startX + 2 * halfTextWidth(array[0]) + mTextSpace, baseLineY + height / 2 + +halfOfTextHeight + yOffset, mPaint)

2 垂直居中

垂直居中的实现,最重要的是需要计算文字基线在垂直方向的位置 计算公式就不在这里解释了

var fontMetrics = mPaint.fontMetrics

// 文字基线y轴坐标 为了 让文字 垂直居中

val baseLineY = height / 2 - fontMetrics.top / 2 - fontMetrics.bottom / 2

二 动画的实现

可以看到 我们默认是没有点赞的,然后点一下就赞,再点一下 取消点赞。所以思路是这样的 首先绘制居中文字,然后在控件看不到的下方再绘制一遍,然后根据平移动画完成这个效果,这个动画是通过属性动画实现的。

// 为了显示效果 根据是否是全部改变 设置不同的绘制方式

if (mChangeMode === 0) {

mPaint.color = mChangedTextColor

canvas.drawText(array[1], width / 2.toFloat() - halfTextWidth(array[1]), baseLineY + yOffset, mPaint)

canvas.drawText(array[2], width / 2.toFloat() - halfTextWidth(array[2]), baseLineY + height / 2 + +halfOfTextHeight + yOffset, mPaint)

} else if (mChangeMode === 1) {

/ 获取部分改变的模式时的绘制文字其实起始位置

startX = width / 2.toFloat() - (2 * halfTextWidth(array[0]) + mTextSpace + 2 * halfTextWidth(array[1])) / 2

mPaint.color = mNoChangeTextColor

canvas.drawText(array[0], startX, baseLineY, mPaint)

mPaint.color = mChangedTextColor

canvas.drawText(array[1], startX + 2 * halfTextWidth(array[0]) + mTextSpace, baseLineY + yOffset, mPaint)

canvas.drawText(array[2], startX + 2 * halfTextWidth(array[0]) + mTextSpace, baseLineY + height / 2 + +halfOfTextHeight + yOffset, mPaint)

}

可以看到 在设置绘制垂直方向的位置的时候,都加入了一个 yOffset 的变量,通过改变这个属性的值也显示动画,那个这个值的最大值很明显就是 文字高度的一半加上控件高度的一半。

halfOfTextHeight = (fontMetrics.bottom - fontMetrics.top) / 2

textOffset = (halfOfTextHeight + height / 2)

自定义属性动画必须添加的 set get 方法

@Suppress("unused")

fun setYOffset(yOffset: Float) {

this.yOffset = yOffset

invalidate()

}

@Suppress("unused")

fun getYOffset() = yOffset

最后提供给外界跳用的方法

fun show() {

hasThumbs = if (hasThumbs) {

val animator = ObjectAnimator.ofFloat(this, "yOffset", -textOffset, 0f)

animator.duration = 500

animator.start()

false

} else {

val animator = ObjectAnimator.ofFloat(this, "yOffset", 0f, -textOffset)

animator.duration = 500

animator.start()

true

}

}

// 调用

val tv: ThumbsView = findViewById(R.id.thumbsView1) as ThumbsView

tv.show()

三 源码

github地址:源码点我直达

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单实现的自定义圆形View示例代码: ``` public class CircleView extends View { private Paint mPaint; private int mColor; public CircleView(Context context) { super(context); init(); } public CircleView(Context context, AttributeSet attrs) { super(context, attrs); TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CircleView); mColor = ta.getColor(R.styleable.CircleView_circle_color, Color.RED); ta.recycle(); init(); } private void init() { mPaint = new Paint(); mPaint.setColor(mColor); mPaint.setAntiAlias(true); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec); int height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec); int size = Math.min(width, height); setMeasuredDimension(size, size); } @Override protected void onDraw(Canvas canvas) { int radius = getWidth() / 2; canvas.drawCircle(radius, radius, radius, mPaint); } public void setColor(int color) { mColor = color; mPaint.setColor(mColor); invalidate(); } } ``` 这个自定义View继承自View类,重写了onMeasure和onDraw方法,实现了一个简单的圆形View。此外,还包含一个setColor方法,用于设置圆形的颜色。 在XML布局文件中,可以使用该自定义View并设置其属性,如下所示: ``` <com.example.customview.CircleView android:id="@+id/circle_view" android:layout_width="100dp" android:layout_height="100dp" app:circle_color="@color/blue" /> ``` 其中,app:circle_color是自定义的属性,在CircleView类的构造方法中使用TypedArray获取该属性的值,并设置圆形的颜色。 希望这个示例代码能够帮到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值