用简单的圆环来表示一个任务的完成度

今天看书写一个小的自定义圆环来表示任务的完成度

需求很简单,好久没写自定义的view了,感觉有些生疏,以前一直以为知道怎么写的就可以了,现在发现如果越发的这样下去,自己的能力也会越来越弱,到最后就只能是代码的搬运工了。代码很简单,下面简单的叙述一下把:

先上个效果图把:




下面简单介绍一下这个小项目。

主要绘制这个有三个步骤

1.绘制一个中间的圆形。
2.在中间的圆形上写上文字
3.在圆的外面画一个圆环

这里是进行画笔的初始化,这里我直接初始化好文字的大小,没有做灵活的设置,有需要可以自己进行修改。
 private void init() {
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.parseColor("#000fff"));

        textPaint = new TextPaint();
        textPaint.setTextSize(26);
        textPaint.setColor(Color.parseColor("#ffffff"));
        textSize = textPaint.measureText(mString);

        paintRectF = new Paint(Paint.ANTI_ALIAS_FLAG);
        paintRectF.setColor(Color.parseColor("#000fff"));
        paintRectF.setStyle(Paint.Style.STROKE);

    }

下面进行处理关于测量模式不同会引起的问题,这里网上有很多写法,主要是处理当自定义的view设置宽高为warp时出现的问题。
@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(MeasureWidth(widthMeasureSpec), MeasureWidth(widthMeasureSpec));
        viewWidth =getWidth();
        centerXY = viewWidth /2;
        mRadiues = (float) (viewWidth *0.5/2);
        rectF = new RectF((float) (viewWidth *0.1),
                (float) (viewWidth *0.1),
                (float) (viewWidth *0.9),
                (float) (viewWidth *0.9));
    }

    private int MeasureWidth(int widthMeasureSpec) {
        int result;
        int size = MeasureSpec.getSize(widthMeasureSpec);
        int mode = MeasureSpec.getMode(widthMeasureSpec);
        if (mode== MeasureSpec.EXACTLY) {
            result=size;
        }else {
            result=400;
            if (mode== MeasureSpec.AT_MOST) {
                result=Math.min(result,size);
            }
        }
        return result;
    }

下面是关键的绘制方法,这里我简单的限制输入的字的多少。
@Override
    protected void onDraw(Canvas canvas) {
        //画中心的圆
        canvas.drawCircle(centerXY,centerXY,mRadiues,paint);
        //绘制外面的环形
        paintRectF.setStrokeWidth(rectF.width()/2-mRadiues);
        canvas.drawArc(rectF,270,mSweepAngle,false,paintRectF);
        if (mString.length()<8) {
            //在圆中心写字
            canvas.drawText(mString,0,mString.length(),centerXY-(textSize/2),centerXY,textPaint);
        }else {
            Toast.makeText(mContext,"字数太多了",Toast.LENGTH_SHORT).show();
        }


    }

基本上就上面这几个代码片段就可以完成这个简单的view了,这里我没有加入自定义的属性,应该加入一些属性,比如让用户自己在xml中进行文字大小的设置,颜色的设置等等。。。。这里就不给出了。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 Layer-List 和 Rotate Animation 来实现这个效果。 1. 首先,在 res/drawable 目录下新建一个 xml 文件,例如 ring.xml,用来定义圆环的形状和颜色。代码如下: ``` <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:innerRadius="30dp" android:thickness="10dp" android:shape="ring" android:useLevel="false"> <solid android:color="@android:color/transparent" /> <stroke android:width="5dp" android:color="@android:color/holo_blue_light" /> </shape> </item> </layer-list> ``` 2. 接着,在 res/anim 目录下新建一个 xml 文件,例如 rotate.xml,用来定义圆环的旋转动画。代码如下: ``` <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:fromDegrees="0" android:toDegrees="45" android:pivotX="50%" android:pivotY="50%" /> ``` 3. 最后,在布局文件中添加一个 ImageView,并将上述两个文件作为其 background 和 animation 属性。代码如下: ``` <ImageView android:id="@+id/ring" android:layout_width="100dp" android:layout_height="100dp" android:background="@drawable/ring" android:layout_centerInParent="true" android:clickable="true" android:onClick="rotate" /> ``` 其中,rotate 是一个在 Activity 中定义的方法,用来触发动画。代码如下: ``` public void rotate(View view) { ImageView ring = (ImageView) view; Animation anim = AnimationUtils.loadAnimation(this, R.anim.rotate); ring.startAnimation(anim); } ``` 现在,点击圆环就可以看到它顺时针旋转45度的动画效果了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值