当前位置: 移动技术网 > IT编程>移动开发>Android > Android自定义View仿QQ等级天数进度

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

酒神(阴阳冕),柴王群,十五个月宝宝发育指标

最近一直都在看自定义view这一块。差不多一个星期了吧。这个星期坚持每天更新博客,感觉自己的技术也有点突破,对自定义view的计算也有了更深的认识。

今天看到手机一个成长天数进度的控件,觉得挺有意思的,于是想自己也写一个。效果如下:

由图可以知道,这里面有很多个元素,首先是背景的矩形区域,其次就是两个环形,然后三个text文本。其实不复杂,我们一点一点的去实现。

首先呢,画矩形背景。这里用到一个rectf的类,这个类包含一个矩形的四个单精度浮点坐标。矩形通过上下左右4个边的坐标来表示一个矩形。这些坐标值属性可以被直接访问,用width()和 height()方法可以获取矩形的宽和高,同时他还有构造方法:

rectf一共有四个构造方法:

rectf()构造一个无参的矩形

rectf(float left,float top,float right,float bottom)构造一个指定了4个参数的矩形

rectf(rect f r)根据指定的rectf对象来构造一个rectf对象(对象的左边坐标不变)

rectf(rect r)根据给定的rect对象来构造一个rectf对象

那么,这里使用第二个构造方法,代码如下:

  @override
  protected void onsizechanged(int w, int h, int oldw, int oldh) {
    super.onsizechanged(w, h, oldw, oldh);
    mwidth=getwidth();
    mheight=getheight();
    mrectf=new rectf((float)(mwidth*0.1), (float)(mheight*0.1), (float)(mwidth*0.9), (float)(mheight*0.9));

  }

现在是矩形的背景有了,那么,还有环形跟文字又怎么去处理呢,别着急,我们先看看这个环形,我这里之所以定义两个环形,是因为,一个用作进度去显示,一个当做背景去实现,好了,分别绘制两个环形。代码如下:

  canvas.drawarc(mrectf, 90, 360, false, mbuttompaint);
  canvas.drawarc(mrectf, 15, 180, false, mtoppaint);

两个环形也有了,接下来就是文字了,绘制文字我们使用canvas.drawtext方法,去绘制,具体代码如下:

canvas.drawtext("5.0", (mwidth-(mtextwidth+mtextsmail))/2, (float)(mheight/2), mtextpaint);

canvas.drawtext("天", (mwidth-(mtextwidth+mtextsmail))/2+mtextwidth, (float)(mheight/2), msmailtextpaint);

canvas.drawtext("升级年费超级会员立即升至", (mwidth-mtextsmailbuttom)/2, (float)(mheight/2+30), msmailtextpaint);

这下全部的效果也出来了,最后,我贴上所有的代码:

public class myprogress extends view {

  private paint mbuttompaint;

  private paint mtoppaint;

  private paint mtextpaint;

  private paint msmailtextpaint;

  private float mwidth;

  private float mheight;

  private rectf mrectf;


  public myprogress(context context, attributeset attrs, int defstyleattr) {
    super(context, attrs, defstyleattr);

    initview();

  }
  public myprogress(context context, attributeset attrs) {
    super(context, attrs);
    initview();
  }

  public myprogress(context context) {
    super(context);
    initview();
  }

  private void initview() {
    mbuttompaint=new paint();
    mbuttompaint.setcolor(color.rgb(69, 142, 253));
    mbuttompaint.setantialias(true);
    mbuttompaint.setstrokewidth(10);
    mbuttompaint.setstyle(style.stroke);

    mtoppaint=new paint();
    mtoppaint.setcolor(color.parsecolor("#ffffff"));
    mtoppaint.setantialias(true);
    mtoppaint.setstrokewidth(10);
    mtoppaint.setstyle(style.stroke);

    mtextpaint=new paint();
    mtextpaint.setcolor(color.white);
    mtextpaint.setantialias(true);
    mtextpaint.setstrokewidth(5);
    mtextpaint.settextsize(50);

    msmailtextpaint=new paint();
    msmailtextpaint.setstrokewidth(3);
    msmailtextpaint.setcolor(color.white);
    msmailtextpaint.setantialias(true);
    msmailtextpaint.settextsize(15);

  }

  @override
  protected void onsizechanged(int w, int h, int oldw, int oldh) {
    super.onsizechanged(w, h, oldw, oldh);
    mwidth=getwidth();
    mheight=getheight();
    mrectf=new rectf((float)(mwidth*0.1), (float)(mheight*0.1), (float)(mwidth*0.9), (float)(mheight*0.9));

  }
  @override
  protected void ondraw(canvas canvas) {
    super.ondraw(canvas);

    canvas.drawarc(mrectf, 90, 360, false, mbuttompaint);

    canvas.drawarc(mrectf, 15, 180, false, mtoppaint);

    float mtextwidth=mtextpaint.measuretext("5.0");

    float mtextsmail=msmailtextpaint.measuretext("天");

    float mtextsmailbuttom=msmailtextpaint.measuretext("升级年费超级会员立即升至");

    canvas.drawtext("5.0", (mwidth-(mtextwidth+mtextsmail))/2, (float)(mheight/2), mtextpaint);

    canvas.drawtext("天", (mwidth-(mtextwidth+mtextsmail))/2+mtextwidth, (float)(mheight/2), msmailtextpaint);

    canvas.drawtext("升级年费超级会员立即升至", (mwidth-mtextsmailbuttom)/2, (float)(mheight/2+30), msmailtextpaint);

  }


}

谢谢阅读。

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网