五陵年少金市东,银鞍白马渡春风。这篇文章主要讲述Android 自己定义View学习相关的知识,希望能为你提供帮助。
上一篇学习了基本使用方法,今天学一下略微复杂一点的。先看一下效果图
文章图片
为了完毕上面的效果还是要用到上一期开头的四步
1,属性应该要有颜色,要有速度
< ?xml version="1.0" encoding="utf-8"?> < resources> < attr name="speed" format="integer" /> < attr name="circleColor" format="color" /> < declare-styleable name="ViewCircle"> < attr name="speed" /> < attr name="circleColor" /> < /declare-styleable> < /resources>
假设对这里有什么不了解能够看我上一篇Android 自己定义View学习(1)
2, 在构造方法中获得这些属性
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ViewCircle, defStyle, 0); int n = a.getIndexCount(); for (int i = 0; i < n; i++) { int attr = a.getIndex(i); switch (attr) { case R.styleable.ViewCircle_speed: mSpeed = a.getInteger(attr, 300); break; case R.styleable.ViewCircle_circleColor: mColor = a.getColor(attr, Color.GREEN); break; } } a.recycle();
3,这次我们不重写onMeasure
4,重写onDraw
protected void onDraw(Canvas canvas) { // 居中 canvas.translate(getWidth() / 2, getHeight() / 2); // 画出三个圆 canvas.drawCircle(0, 0, 200, mCircle); canvas.drawCircle(0, 0, 180, mCentreCircle); canvas.drawCircle(0, 0, 160, mNexCircle); //进度 RectF rectF = new RectF(-180, -180, 180, 180); canvas.drawArc(rectF, -90, mProgress, true, mTimer); //算出字体所占大小,使其居中 mLinePaint.getTextBounds(String.valueOf(mProgress), 0, String.valueOf(mProgress).length(), rect); canvas.drawText(String.valueOf(mProgress), -rect.width() / 2, 0, mLinePaint); //总进度为六十 int count = 60; //刻度从190--200 int y = 190; Rect rect = new Rect(); mLinePaint.getTextBounds("00", 0, "00".length(), rect); //当i%10==0时画一道刻度线 for (int i = 0; i < count; i++) { if (i % 10 == 0) { canvas.drawLine(0, y, 0, 200, mLinePaint); canvas.drawText(String.valueOf(i / 10) + "0", -rect.width() / 2, 220, mLinePaint); } canvas.rotate(360 / count, 0, 0); } }
我们注意一下canvas.drawArc(rectF, -90, mProgress, true, mTimer);
我们传进去的为true效果就是
文章图片
假设我们传进去false
文章图片
能够明显的看到区别,没事也能够试试我们这个demo传进去false会是什么效果。
【Android 自己定义View学习】接下来为了让这个进度动起来我们就要用到线程来刷新ui
new Thread() { public void run() { while (true) { mProgress++; if (mProgress == 360) { mProgress = 0; }postInvalidate(); try { Thread.sleep(mSpeed); } catch (InterruptedException e) { e.printStackTrace(); } } }; }.start();
这样基本就差点儿相同了。
。
接下来看看终于效果
文章图片
项目源代码
推荐阅读
- Android 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚
- android cannot locate symbol 'sigemptyset'问题解决
- Android捕获View焦点事件,LinearLayout结合HorizontalScrollView实现ViewPgaer和选项卡Tabs联动
- call 和 apply方法解析
- Android 主要控件
- 关于Android教学的思考1
- 使用Android design support library在Eclipse和Android Studio
- apply()
- Android onKeyDown 两次返回键退出