Android自定义View仿QQ运动步数效果

本文实例为大家分享了Android QQ运动步数的具体代码,供大家参考,具体内容如下

今天我们实现下面这样的效果:

首先自定义属性:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <declare-styleable name="MyQQStep">
    <attr name="out_color" format="color"/>
    <attr name="inner_color" format="color"/>
    <attr name="border_width" format="dimension"/>
    <attr name="text_size" format="dimension"/>
    <attr name="text_color" format="color"/>
  </declare-styleable>
</resources>

自定义View代码如下:

/**
 * Created by Michael on 2019/11/1.
 */

public class MyQQStep extends View {

  private int out_color;
  private int inner_color;
  private float width;
  private float textSize;
  private int color;
  private int width01;
  private int height01;
  private Paint outPaint;
  private Paint innerPaint;
  private Paint textPaint;

  private float percent;
  private int step;

  public MyQQStep(Context context) {
    this(context,null);
  }

  public MyQQStep(Context context, @Nullable AttributeSet attrs) {
    this(context, attrs,0);
  }

  public MyQQStep(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    TypedArray array = context.obtainStyledAttributes(attrs,R.styleable.MyQQStep);
    out_color = array.getColor(R.styleable.MyQQStep_out_color, Color.BLACK);
    inner_color = array.getColor(R.styleable.MyQQStep_inner_color, Color.RED);
    width = array.getDimension(R.styleable.MyQQStep_border_width,10);
    textSize = array.getDimensionPixelSize(R.styleable.MyQQStep_text_size,20);
    color = array.getColor(R.styleable.MyQQStep_text_color, Color.GREEN);
    array.recycle();
    initPaint();
    percent = 0;
    step = 5000;
  }

  private void initPaint() {
    outPaint = new Paint();
    outPaint.setAntiAlias(true);
    outPaint.setStyle(Paint.Style.STROKE);
    outPaint.setStrokeWidth(width);
    outPaint.setColor(out_color);
    outPaint.setStrokeCap(Paint.Cap.ROUND);

    innerPaint = new Paint();
    innerPaint.setAntiAlias(true);
    innerPaint.setStrokeWidth(width);
    innerPaint.setStyle(Paint.Style.STROKE);
    innerPaint.setColor(inner_color);
    innerPaint.setStrokeCap(Paint.Cap.ROUND);

    textPaint = new Paint();
    textPaint.setAntiAlias(true);
    textPaint.setColor(color);
    textPaint.setStyle(Paint.Style.STROKE);
    textPaint.setTextSize(textSize);

  }

  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    //super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    int widthMode = MeasureSpec.getMode(widthMeasureSpec);
    int heightMode = MeasureSpec.getMode(heightMeasureSpec);
    if (widthMode == MeasureSpec.AT_MOST){

    }else{
      width01 = MeasureSpec.getSize(widthMeasureSpec);
    }
    if (heightMode == MeasureSpec.AT_MOST){

    }else{
      height01 = MeasureSpec.getSize(heightMeasureSpec);
    }
    setMeasuredDimension((width01>height01?height01:width01)
        ,(width01>height01?height01:width01));
  }

  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    int realWidth = getWidth()>getHeight()?getHeight():getWidth();
    int realHeight = getWidth()>getHeight()?getHeight():getWidth();
    RectF r1 = new RectF(width/2,width/2,realWidth-width/2
        ,realHeight-width/2);
    canvas.drawArc(r1,135,270,false,outPaint);
    canvas.drawArc(r1,135,270*percent,false,innerPaint);

    Rect r = new Rect();
    String s = step+"";
    textPaint.getTextBounds(s,0,s.length(),r);
    int textWidth = r.width();
    int textHeight = r.height();
    Paint.FontMetricsInt fontMetricsInt = new Paint.FontMetricsInt();
    int dy = (fontMetricsInt.bottom-fontMetricsInt.top)/2-fontMetricsInt.bottom;
    int baseLine = textHeight/2+dy+realHeight/2-textHeight/2;
    int x0 = realWidth/2-textWidth/2;
    canvas.drawText(s,x0,baseLine,textPaint);

  }

  public void setPercent(float percent,float value){
    this.percent = percent;
    this.step = (int) value;
    invalidate();
  }

}

最后在布局以及MainActivity中调用:

<com.example.qq_step.MyQQStep
    android:id="@+id/qq_step"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:out_color="@color/colorAccent"
    app:border_width="10dp"
    app:inner_color="@color/colorPrimary"
    app:text_size="20sp"
    app:text_color="@color/colorPrimaryDark"
    />
 private void initView() {
    final MyQQStep qq_view = findViewById(R.id.qq_step);
    ValueAnimator animator = ValueAnimator.ofFloat(0,5000);
    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
      @Override
      public void onAnimationUpdate(ValueAnimator animation) {
        float p = animation.getAnimatedFraction();
        qq_view.setPercent(p,5000*p);
      }
    });
    animator.setDuration(10000);
    animator.start();

  }

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

(0)

相关推荐

  • Android基于Xposed修改微信运动步数实例

    前言:Zygote 是 Android 的核心,每打开一个 app,Zygote 就会 fork 一个虚拟机实例来运行 app,基于Xposed我们可以使用android hook技术对APK中的方法进行调试.关键API拦截.外挂等. 这篇文章建立在Xposed模块开发的基础之上,没有开发过Xposed模块的请先看这篇入门教程<Xposed模块开发入门教程> 一.微信运动修改步数原理 当点击微信运动排行榜的时候微信APP会获取手机上计数传感器的数值,然后传感器会返回我们行走的步数.此时我们使用

  • Android 自定View实现仿QQ运动步数圆弧及动画效果

    在之前的Android超精准计步器开发-Dylan计步中的首页用到了一个自定义控件,和QQ运动的界面有点类似,还有动画效果,下面就来讲一下这个View是如何绘制的. 1.先看效果图 2.效果图分析 功能说明:黄色的代表用户设置的总计划锻炼步数,红色的代表用户当前所走的步数. 初步分析:完全自定义View重写onDraw()方法,画圆弧. 3.画一个圆弧必备知识 在Canvas中有一个画圆弧的方法 drawArc(RectF oval, float startAngle, float sweepA

  • Android自定义View仿QQ运动步数效果

    本文实例为大家分享了Android QQ运动步数的具体代码,供大家参考,具体内容如下 今天我们实现下面这样的效果: 首先自定义属性: <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyQQStep"> <attr name="out_color" format="colo

  • Android自定义view仿QQ的Tab按钮动画效果(示例代码)

    话不多说 先上效果图 实现其实很简单,先用两张图 一张是背景的图,一张是笑脸的图片,笑脸的图片是白色,可能看不出来.实现思路:主要是再触摸view的时候同时移动这两个图片,但是移动的距离不一样,造成的错位感,代码很简单: import android.content.Context import android.graphics.* import android.util.AttributeSet import android.view.MotionEvent import android.vi

  • Android自定义View 仿QQ侧滑菜单的实现代码

    先看看QQ的侧滑效果 分析一下 先上原理图(不知道能否表达的清楚 ==) -首先这里使用了 Android 的HorizontalScrollView 水平滑动布局作为容器,当然我们需要继承它自定义一个侧滑视图 - 这个容器里面有一个父布局(一般用LinerLayout,本demo用的是),这个父布局里面有且只有两个子控件(布局),初始状态菜单页的位置在Y轴上存在偏移这样可以就可以形成主页叠在菜单页的上方的视觉效果:然后在滑动的过程程中 逐渐修正偏移,最后菜单页和主页并排排列.原理搞清了实现起来

  • Android自定义View仿微博运动积分动画效果

    自定义View一直是自己的短板,趁着公司项目不紧张的时候,多加强这方面的练习.这一系列文章主要记录自己在自定义View的学习过程中的心得与体会. 刷微博的时候,发现微博运动界面,运动积分的显示有一个很好看的动画效果.OK,就从这个开始我的自定义view之路! 看一下最后的效果图: 分数颜色,分数大小,外圆的颜色,圆弧的颜色都支持自己设置,整体还是和微博那个挺像的.一起看看自定义View是怎样一步一步实现的: 1.自定义view的属性: 在res/values/ 下建立一个attrs.xml ,

  • Android自定义View仿QQ健康界面

    最近一直在学习自定义View相关的知识,今天给大家带来的是QQ健康界面的实现.先看效果图: 可以设置数字颜色,字体颜色,运动步数,运动排名,运动平均步数,虚线下方的蓝色指示条的长度会随着平均步数改变而进行变化.整体效果还是和QQ运动健康界面很像的. 自定义View四部曲,一起来看看怎么实现的. 1.自定义view的属性: <?xml version="1.0" encoding="utf-8"?> <resources> //自定义属性名,定

  • Android自定义View实现QQ运动积分转盘抽奖功能

    因为偶尔关注QQ运动, 看到QQ运动的积分抽奖界面比较有意思,所以就尝试用自定义View实现了下,原本想通过开发者选项查看下界面的一些信息,后来发现积分抽奖界面是在WebView中展示的,应该是在H5页面中用js代码实现的,暂时不去管它了. 这里的自定义View针对的是继承自View的情况,你可以将Canvas想象为画板, Paint为画笔,自定义View的过程和在画板上用画笔作画其实类似,想象在画板上作画的过程,你要画一个多大图形(对应View的测量 onMeasure方法),你要画什么样的图

  • Android自定义View仿QQ等级天数进度

    最近一直都在看自定义View这一块.差不多一个星期了吧.这个星期坚持每天更新博客,感觉自己的技术也有点突破,对自定义View的计算也有了更深的认识. 今天看到手机一个成长天数进度的控件,觉得挺有意思的,于是想自己也写一个.效果如下: 由图可以知道,这里面有很多个元素,首先是背景的矩形区域,其次就是两个环形,然后三个Text文本.其实不复杂,我们一点一点的去实现. 首先呢,画矩形背景.这里用到一个RectF的类,这个类包含一个矩形的四个单精度浮点坐标.矩形通过上下左右4个边的坐标来表示一个矩形.这

  • Android自定义view仿iOS弹出框效果

    本文实例为大家分享了Android自定义view仿iOS弹出框的具体代码,供大家参考,具体内容如下 运行效果图 自定义对话框的使用,仿照ios.从底部弹出,类似pop窗口.包括消息.图片.列表及对话框. 好了,用法都会,直接贴上代码 1.layout布局文件 view_actionsheet.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="ht

  • Android自定义View仿探探卡片滑动效果

    Android自定义View仿探探卡片滑动这种效果网上有很多人已经讲解了实现思路,大多都用的是RecyclerView来实现的,但是我们今天来换一种实现思路,只用一个自定义的ViewGroup来搞定这个实现. 下面我们先看一下实现的效果: 这个自定义View用法也很简单,首先从github上下载或者fork这个项目,在布局中添加: <com.liyafeng.view.swipecard.SwipeCardLayout android:id="@+id/scl_layout" a

随机推荐