广告
返回顶部
首页 > 资讯 > 精选 >Android中怎么实现一个bilibili刷新按钮
  • 532
分享到

Android中怎么实现一个bilibili刷新按钮

android 2023-05-30 19:05:52 532人浏览 独家记忆
摘要

Android中怎么实现一个bilibili刷新按钮,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、分析先来看看原版效果:该按钮由3部分组成,分别是圆角矩形、文字、旋转图标。

Android中怎么实现一个bilibili刷新按钮,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

1、分析

先来看看原版效果:

Android中怎么实现一个bilibili刷新按钮

该按钮由3部分组成,分别是圆角矩形、文字、旋转图标。在点击按钮后,开始加载数据,旋转图标发生旋转,数据加载完成后,旋转图标复位并停止旋转。话不多说,开始敲代码。

2、绘制

这里,我们要绘制的部分有3个,分别是上面提到的圆角矩形、文字、旋转图标。那么这里就为这3部分分别声明了一些属性。

要注意的一点是,这个类中有3个构造函数,因为有部分属性需要在构造函数中初始化(也为之后自定义属性做准备),所以,将第1个与第2个构造函数中的super修改为this。

public class LQRRefreshButton extends View {  // 圆角矩形属性  private int borderColor = Color.parseColor("#fb7299");  private float borderWidth = 0;  private float borderRadius = 120;  // 文字属性  private String text = "点击换一批";  private int textColor = Color.parseColor("#fb7299");  private float textSize = 28;  // 旋转图标属性  private int iconSrc = R.mipmap.tag_center_refresh_icon;  private float iconSize = 28;  private Bitmap iconBitmap;  private float space4TextAndIcon = 20;  // 画笔  private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);  public LQRRefreshButton(Context context) {    this(context, null);  }  public LQRRefreshButton(Context context, @Nullable AttributeSet attrs) {    this(context, attrs, 0);  }  public LQRRefreshButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);    // 将图标资源实例化为Bitmap    iconBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.tag_center_refresh_icon);  }  @Override  protected void onDraw(canvas canvas) {    super.onDraw(canvas);    // 1、画圆角矩形    // 2、画字    // 3、画刷新图标  }}

接下来着重完成onDraw()方法的实现:

@Overrideprotected void onDraw(Canvas canvas) {  super.onDraw(canvas);  // 1、画圆角矩形  mPaint.setStyle(Paint.Style.STROKE);  mPaint.setColor(borderColor);  mPaint.setStrokeWidth(borderWidth);  canvas.drawRoundRect(new RectF(0, 0, getWidth(), getHeight()), borderRadius, borderRadius, mPaint);  // 2、画字  mPaint.setTextSize(textSize);  mPaint.setColor(textColor);  mPaint.setStyle(Paint.Style.FILL);  float measureText = mPaint.measureText(text);  float measureAndIcon = measureText + space4TextAndIcon + iconSize;  float textStartX = getWidth() / 2 - measureAndIcon / 2;  float textBaseY = getHeight() / 2 + (Math.abs(mPaint.ascent()) - mPaint.descent()) / 2;  canvas.drawText(text, textStartX, textBaseY, mPaint);  // 3、画刷新图标  float iconStartX = textStartX + measureText + space4TextAndIcon;  canvas.drawBitmap(iconBitmap, iconStartX, getHeight() / 2 - iconSize / 2, mPaint);}

先来看看效果:

Android中怎么实现一个bilibili刷新按钮

我给该控件设置了宽为200dp,高为100dp。

可以看到效果还不错,但还是有一点点问题的,下面就分别说说这3部分是怎么画的,及存在的小问题。

1)画圆角矩形

其实画圆角矩形很简单,设置好画笔的样式、颜色、线粗,再调用canvas的drawRoundRect()方法即可实现。

因为我们要画的圆角矩形只需要画线,所以画笔的样式便设置为Paint.Style.STROKE。
canvas的drawRoundRect()方法中,第一个参数是绘制范围,这里就直接按该控件的大小来设置即可。第二、三个参数是x轴和y轴的圆角半径,第三个参数是画笔(要画东西当然需要画笔~)。
但你有没有发现,此时的 线粗为0(borderWidth=0),矩形线怎么还有?这是因为画笔的样式为Paint.Style.STROKE,当线粗为0时,还要画出1px的线,因为对画笔来说,最小的线粗就是1px。所以,上面的代码需要做如下改动:

// 1、画圆角矩形if (borderWidth > 0) {  mPaint.setStyle(Paint.Style.STROKE);  mPaint.setColor(borderColor);  mPaint.setStrokeWidth(borderWidth);  canvas.drawRoundRect(new RectF(0, 0, getWidth(), getHeight()), borderRadius, borderRadius, mPaint);}

2)画字

画字的一般步骤是设置文字大小、文字颜色、画笔样式,绘制起点。其中后2个最为重要。

画笔样式对画出的字是有影响的,当画笔样式为Paint.Style.STROKE时,画出来的字是镂空的(不信你可以试试),我们需要的是实心的字,所以需要修改画笔的样式为Paint.Style.FILL。
在安卓中,文字的绘制跟其它绘制是不同的,例如,圆角矩形和旋转图标的绘制起点是左上角,而文字则是按文字左下字为起点,也就是按基线(Baseline)来绘制,故需要得到基线起点的坐标。

Android中怎么实现一个bilibili刷新按钮

如上图中,现在要获得的就是文字左下角的点,这要怎么求呢?

先说x,一般需要让文字居中显示(跟文字的对齐方式也有关系,这里以默认的左对齐为例),所以计算公式一般为: x = 控件宽度/2 - 文字长度/2。但我们这个控件有点不同,它还需要考虑到旋转图标的位置问题,所以x应该这么求: x = 控件宽度/2 - (文字长度+空隙+旋转图标宽度)/2。

// 得到文字长度float measureText = mPaint.measureText(text);// 得到 文字长度+空隙+旋转图标宽度float measureAndIcon = measureText + space4TextAndIcon + iconSize;// 得到文字绘制起点float textStartX = getWidth() / 2 - measureAndIcon / 2;

再说y,如图所示:

Android中怎么实现一个bilibili刷新按钮

如果直接用控件的高度的一半作为文字绘制的基线,那么绘制出来的文字肯定偏上,这是因为Ascent的高度比Descent的高度要高的多,我们在计算Baseline时,需要在Ascent中减去Descent的高度得到两者高度差,再让控件中心y坐标加上(下降)这个高度差的一半。故:

float textBaseY = getHeight() / 2 + (Math.abs(mPaint.ascent()) - mPaint.descent()) / 2;

3)画刷新图标

最后就是画刷新图标了,它是以左上角为起点的,通过canvas的drawBitmap()方法进行绘制即可。

但是,有一点需要注意,iconSize是我自己定的一个大小,并不是图标的实际大小,所以在往后做旋转动画时获取到的旋转中心会有误差,将导致图标旋转时不是按中心进行旋转。所以,这里需要对图标大小进行调整:

public class LQRRefreshButton extends View {  ...  public LQRRefreshButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);    // icon    iconBitmap = BitmapFactory.decodeResource(getResources(), iconSrc);    iconBitmap = zoomImg(iconBitmap, iconSize, iconSize);  }  public Bitmap zoomImg(Bitmap bm, float newWidth, float newHeight) {    // 获得图片的宽高    int width = bm.getWidth();    int height = bm.getHeight();    // 计算缩放比例    float scaleWidth = ((float) newWidth) / width;    float scaleHeight = ((float) newHeight) / height;    // 取得想要缩放的matrix参数    Matrix matrix = new Matrix();    matrix.postScale(scaleWidth, scaleHeight);    // 得到新的图片    Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true);    return newbm;  }  ...}

3、动画

现在,要实现旋转图标的旋转功能了。原理就是在canvas绘制图标时,将canvas进行旋转,canvas旋转着绘制图标也很简单,只需要4步:

canvas.save();canvas.rotate(degress, centerX, centerY);canvas.drawBitmap(iconBitmap, iconStartX, getHeight() / 2 - iconSize / 2, mPaint);canvas.restore();

接下来要做的,就是计算出旋转中心,旋转角度,并不停止的去调用onDraw()编制图标,可以使用ValueAnimator或ObjectAnimator实现这个功能,这里选用ObjectAnimator。实现如下:

public class LQRRefreshButton extends View {  ...  private float degress = 0;  private ObjectAnimator mAnimator;  public LQRRefreshButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);    // 旋转动画    mAnimator = ObjectAnimator.ofObject(this, "degress", new FloatEvaluator(), 360, 0);    mAnimator.setDuration(2000);    mAnimator.setRepeatMode(ObjectAnimator.RESTART);    mAnimator.setInterpolator(new LinearInterpolator());    mAnimator.setRepeatCount(ObjectAnimator.INFINITE);  }  @Override  protected void onDraw(Canvas canvas) {    super.onDraw(canvas);    ...    // 3、画刷新图标    float iconStartX = textStartX + measureText + space4TextAndIcon;    canvas.save();    float centerX = iconStartX + iconSize / 2;    int centerY = getHeight() / 2;    canvas.rotate(degress, centerX, centerY);    canvas.drawBitmap(iconBitmap, iconStartX, getHeight() / 2 - iconSize / 2, mPaint);    canvas.restore();  }  public void start() {    mAnimator.start();  }  public void stop() {    mAnimator.cancel();    setDegress(0);  }  public float getDegress() {    return degress;  }  public void setDegress(float degress) {    this.degress = degress;    invalidate();  }}

使用ObjectAnimator可以对任意属性值进行修改,所以需要在该控件中声明一个旋转角度变量(degress),并编写getter和setter方法,还需要在setter方法中调用invalidate(),这样才能在角度值发生变换时,让控件回调onDraw()进行图标的旋转绘制。ObjectAnimator的使用也不复杂,这里就不详细介绍了。来看下动画效果吧:

Android中怎么实现一个bilibili刷新按钮

4、自定义属性

一个自定义控件,是不能把属性值写死在控件里的,所以我们需要自定义属性,从外界获取这些属性值。

1)属性文件编写

在attrs.xml中编写如下代码:

<?xml version="1.0" encoding="utf-8"?><resources>  <declare-styleable name="LQRRefreshButton">    <attr name="refresh_btn_borderColor" fORMat="color"/>    <attr name="refresh_btn_borderWidth" format="dimension"/>    <attr name="refresh_btn_borderRadius" format="dimension"/>    <attr name="refresh_btn_text" format="string"/>    <attr name="refresh_btn_textColor" format="color"/>    <attr name="refresh_btn_textSize" format="dimension"/>    <attr name="refresh_btn_iconSrc" format="reference"/>    <attr name="refresh_btn_iconSize" format="dimension"/>    <attr name="refresh_btn_space4TextAndIcon" format="dimension"/>  </declare-styleable></resources>

2)属性值获取

在控件的第三个构造函数中获取这些属性值:

public class LQRRefreshButton extends View {  public LQRRefreshButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);    // 获取自定义属性值    TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.LQRRefreshButton);    borderColor = ta.getColor(R.styleable.LQRRefreshButton_refresh_btn_borderColor, Color.parseColor("#fb7299"));    borderWidth = ta.getDimension(R.styleable.LQRRefreshButton_refresh_btn_borderWidth, dipToPx(0));    borderRadius = ta.getDimension(R.styleable.LQRRefreshButton_refresh_btn_borderRadius, dipToPx(60));    text = ta.getString(R.styleable.LQRRefreshButton_refresh_btn_text);    if (text == null)      text = "";    textColor = ta.getColor(R.styleable.LQRRefreshButton_refresh_btn_textColor, Color.parseColor("#fb7299"));    textSize = ta.getDimension(R.styleable.LQRRefreshButton_refresh_btn_textSize, spToPx(14));    iconSrc = ta.getResourceId(R.styleable.LQRRefreshButton_refresh_btn_iconSrc, R.mipmap.tag_center_refresh_icon);    iconSize = ta.getDimension(R.styleable.LQRRefreshButton_refresh_btn_iconSize, dipToPx(14));    space4TextAndIcon = ta.getDimension(R.styleable.LQRRefreshButton_refresh_btn_space4TextAndIcon, dipToPx(10));    ta.recycle();      ...  }}

这里有一点需要留意:

ta.getDimension(属性id, 默认值)
1
2

通过TypedArray对象可以从外界到的的值会根据单位(如:dp、sp)的不同自动转换成px,但默认值的单位是一定的,为px,所以为了符合安卓规范,不要直接使用px,所以需要手动做个转换。最后还需要调用recycle()方法回收TypedArray。

3)在布局文件中应用

<com.lqr.biliblili.mvp.ui.widget.LQRRefreshButton  android:id="@+id/btn_refresh"  android:layout_width="118dp"  android:layout_height="32dp"  android:layout_gravity="center"  android:layout_marginBottom="3Dp"  android:layout_marginTop="8dp"  app:refresh_btn_borderRadius="25dp"  app:refresh_btn_borderWidth="1dp"  app:refresh_btn_iconSize="16dp"  app:refresh_btn_text="点击换一批"  app:refresh_btn_textColor="@color/bottom_text_live"  app:refresh_btn_textSize="14sp"/>

看完上述内容,你们掌握Android中怎么实现一个bilibili刷新按钮的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: Android中怎么实现一个bilibili刷新按钮

本文链接: https://www.lsjlt.com/news/220449.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android中怎么实现一个bilibili刷新按钮
    Android中怎么实现一个bilibili刷新按钮,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、分析先来看看原版效果:该按钮由3部分组成,分别是圆角矩形、文字、旋转图标。...
    99+
    2023-05-30
    android
  • 怎么在Android中实现一个悬浮按钮
    怎么在Android中实现一个悬浮按钮?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。具体实现代码:import android.content.Context;i...
    99+
    2023-05-31
    android roi %d
  • 怎么在Android中利用FloatingActionButton实现一个悬浮按钮效果
    今天就跟大家聊聊有关怎么在Android中利用FloatingActionButton实现一个悬浮按钮效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。首先是这个最小的Tag:这个T...
    99+
    2023-05-31
    android floatingbutton roi
  • vue中按钮操作完刷新页面的实现
    目录vue按钮操作完刷新页面1.父组件中实现2.子组件绑定点击按钮后自动刷新页面vue按钮操作完刷新页面 首先从子组件和父组件角度去写这个东西,简言之就是在父组件中实现这个刷新功能方...
    99+
    2022-11-13
  • Android应用中怎么实现一个下拉刷新功能
    Android应用中怎么实现一个下拉刷新功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、下拉才出现的视图pull_to_refresh_header.xml<x...
    99+
    2023-05-31
    android roi
  • vue中按钮操作完刷新页面如何实现
    这篇文章主要介绍“vue中按钮操作完刷新页面如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue中按钮操作完刷新页面如何实现”文章能帮助大家解决问题。vue按钮操作完刷新页面首先从子组件和父...
    99+
    2023-07-02
  • Android怎么实现单选按钮
    这篇文章主要介绍了Android怎么实现单选按钮的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android怎么实现单选按钮文章都会有所收获,下面我们一起来看看吧。单选按钮在默认情况下,单选按钮显示为一个圆形图...
    99+
    2023-06-30
  • Android侧滑按钮怎么实现
    这篇文章主要介绍“Android侧滑按钮怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android侧滑按钮怎么实现”文章能帮助大家解决问题。Android侧滑按钮效果如下所示:导入闭包将以...
    99+
    2023-06-29
  • 在Android开发中使用WindowManager实现一个悬浮按钮
    这篇文章将为大家详细讲解有关在Android开发中使用WindowManager实现一个悬浮按钮,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。效果:整体思路360手机卫士的内存球其实就是一个...
    99+
    2023-05-31
    android windowmanager age
  • Android单选按钮RadioButton怎么实现
    这篇文章主要介绍Android单选按钮RadioButton怎么实现,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!单选按钮要在一组中选择一项,并且不能多选。同一组RadioButton要放在同一个RadioGroup...
    99+
    2023-06-15
  • jQuery怎么实现点击一下按钮添加一个段落
    今天小编给大家分享一下jQuery怎么实现点击一下按钮添加一个段落的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面...
    99+
    2022-10-19
  • android按钮点击效果怎么实现
    Android按钮点击效果可以通过以下几种方式实现:1. 使用Selector实现点击效果:在res/drawable目录下创建一个xml文件,例如button_selector.xml,然后在文件中定义按钮的不同状态下的背景...
    99+
    2023-08-11
    android
  • VB.NET中怎么制作一个图片按钮
    VB.NET中怎么制作一个图片按钮,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。VB.NET制作图片按钮思路:很简单,就是在一个picturebox控件上放置一个button控...
    99+
    2023-06-17
  • Android中使用FloatingActionButton实现一个点击按钮返回顶部功能
    这期内容当中小编将会给大家带来有关Android中使用FloatingActionButton实现一个点击按钮返回顶部功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。FloatingActionButt...
    99+
    2023-05-31
    android roi floatingactionbutton
  • 怎么在Android应用中添加一个图文并茂的按钮
    怎么在Android应用中添加一个图文并茂的按钮?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。代码:<LinearLayout android:orie...
    99+
    2023-05-31
    android roi
  • Android怎么实现自定义开关按钮
    这篇文章主要讲解了“Android怎么实现自定义开关按钮”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android怎么实现自定义开关按钮”吧!一、原理我们在界面的某一个区域里放置一个背景图...
    99+
    2023-06-30
  • 使用vue怎么实现一个可移动的悬浮按钮
    使用vue怎么实现一个可移动的悬浮按钮?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Vue的优点Vue具体轻量级框架、简单易学、双向数据绑定、组件化、数据和结构的分离、虚拟...
    99+
    2023-06-06
  • bootstrap怎么实现重新启用提交按钮
    这篇文章主要介绍了bootstrap怎么实现重新启用提交按钮的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇bootstrap怎么实现重新启用提交按钮文章都会有所收获,下面我们一...
    99+
    2022-10-19
  • 使用Ajax怎么实现一个无刷新分页
    本篇文章为大家展示了使用Ajax怎么实现一个无刷新分页,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。<!doctype html><html lang=&quo...
    99+
    2023-06-08
  • android按钮圆形点击效果怎么实现
    要实现Android按钮的圆形点击效果,可以通过以下步骤进行:1. 在res/drawable文件夹下创建一个新的XML文件,命名为...
    99+
    2023-08-18
    android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作