Android 自己定义View学习(2)

上一篇学习了基本使用方法,今天学一下略微复杂一点的。先看一下效果图

为了完毕上面的效果还是要用到上一期开头的四步

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会是什么效果。

接下来为了让这个进度动起来我们就要用到线程来刷新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();

这样基本就差点儿相同了。

接下来看看终于效果

项目源代码

时间: 2024-08-02 15:56:23

Android 自己定义View学习(2)的相关文章

Android 自己定义View (二) 进阶

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24300125 继续自己定义View之旅.前面已经介绍过一个自己定义View的基础的样例,Android 自己定义View (一),假设你还对自己定义View不了解能够去看看.今天给大家带来一个略微复杂点的样例. 自己定义View显示一张图片,以下包括图片的文本介绍,类似相片介绍什么的,只是不重要,主要是学习自己定义View的使用方法么. 还记得上一篇讲的4个步骤么: 1.自己定

手把手带你画一个 时尚仪表盘 Android 自己定义View

拿到美工效果图.咱们程序猿就得画得一模一样. 为了不被老板喷,仅仅能多练啊. 听说你认为前面几篇都so easy,那今天就带你做个相对照较复杂的. 转载请注明出处:http://blog.csdn.net/wingichoy/article/details/50468674 注意:每一篇博客都是建立在之前博客的基础知识上的,假设你刚接触自己定义view.能够来说说自己定义view简单学习的方式这里看我曾经的文章.记录了我学习自己定义view的过程,并且前几篇博客或多或少犯了一些错误(反复绘制,o

Android自己定义View基础篇(三)之SwitchButton开关

自己定义View基础篇(二) 自己定义View基础篇(一) 自己定义View原理 我在解说之前,先来看看效果图,有图有真相:(转换gif图片效果太差) 那来看看真实图片: 假设你要更改样式,请改动例如以下图片: switch_ball switch_bg switch_black switch_bottom 我在这里就不反复解说View与ViewGroup的关系,View的绘制流程.假设你对自己定义View还不甚了解.请看上面几篇文章. 用法 xml文件: <com.github.ws.swit

Android 自己定义View (四) 视频音量调控

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24529807 今天没事逛eoe,看见有人求助要做一个以下的效果,我看以下一哥们说要用12张图片,这尼玛逆天的麻烦,细致看了一下感觉自己定义控件木有问题,就花点时间写了一个. 好了,进入正题,继续我们的自己定义View四部曲. 1.先分许须要的属性,两个小块的颜色.一张中间的图片.间隙大小.一个多少个块块.分析完成,開始写attr.xml <?xml version="1.

android 子定义View(2)

onMeasure中获取自定义View的mode 和width, height, // TODO 测量 int mode = MeasureSpec.getMode(widthMeasureSpec); int width = MeasureSpec.getSize(widthMeasureSpec); 通过MeasureSpec的三个mode类型, 而进行width和height的设置, 如果是EXACTLY 测量的数据就是自定义view的高度, 在不居中 layout_width或layou

Android之自定义View学习(一)

Canvas常用方法: 图片来源 public class BaseViewDraw extends View { private Paint mPaint1; private Paint mPaint2; private Paint mPaint3; public BaseViewDraw(Context context) { super(context); } public BaseViewDraw(Context context, AttributeSet attrs) { super(c

Android自己定义View画图实现拖影动画

前几天在"Android画图之渐隐动画"一文中通过画线实现了渐隐动画,但里面有个问题,画笔较粗(大于1)时线段之间会有裂隙.我又改进了一下.这次效果好多了. 先看效果吧: 然后我们来说说主要的做法: 依据画笔宽度,计算每一条线段两个顶点相应的四个点,四点连线.包围线段,形成一个路径. 后一条线段的路径的前两个点,取(等于)前一条线段的后两点.这样就衔接起来了. 把Path的Style改动为FILL.效果是这种: 能够看到一个个四边形.连成了路径. 好啦.如今说说如何依据两点计算出包围它

Android自己定义View之仪表盘

新建项目,新建DashBoardView继承自View实现OnGlobalLayoutListener接口,并重写OnDraw方法. 使用OnGlobalLayoutListener接口须要重写onGlobalLayout方法.在这种方法中我们将获取View的宽高. 新建例如以下变量: private Context mContext; private Paint mCirclePaint,mDegreePaint,mHourPaint,mMinPaint; private int mViewW

Android画图系列(二)——自己定义View绘制基本图形

这个系列主要是介绍下Android自己定义View和Android画图机制.自己能力有限.假设在介绍过程中有什么错误.欢迎指正 前言 在上一篇Android画图系列(一)--自己定义View基础中我们了解自己定义View相关的基本知识.只是,这些东西依然还是理论,接下来我们就实际绘制一些东西 在本篇文章中,我们先了解下面Canvas,而且画一些主要的图形 Canvas简单介绍 Canvas我们能够称之为画布.能够在上面绘制各种东西.是安卓平台2D图形绘制的基础.非常强大. 一般来说,比較基础的东