欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-03-05 14:09:12
最近一直都在看自定义view这一块。差不多一个星期了吧。这个星期坚持每天更新博客,感觉自己的技术也有点突破,对自定义view的计算也有了更深的认识。 今天看到手机一个成长...

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

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

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

由图可以知道,这里面有很多个元素,首先是背景的矩形区域,其次就是两个环形,然后三个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);

  }


}

谢谢阅读。

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