!自定义控件式需要实现AttrbuteSet   可在xml文件中配置略过创建该对象

普通的View只能在主线程中绘制界面,适用于简单的被动绘制

SurfaceView则可以在新线程中绘制界面,不会阻塞主线程,适用于需要不停主动重绘的界面

xml布局代码

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}" >

<com.lzh.study.TestSurface
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<com.lzh.study.TestView
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

</RelativeLayout>

1.普通View直接重写onDraw()即可

package com.lzh.study;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;

public class TestView extends View {

public TestView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO 自动生成的构造函数存根
}

@Override
protected void onDraw(Canvas canvas) {
// TODO 自动生成的方法存根
super.onDraw(canvas);
Paint paint = new Paint();
paint.setTextSize(48);
paint.setColor(Color.RED);
canvas.drawText("wo", 200, 200, paint);
// canvas.drawARGB(255, 255, 255,255);
canvas.drawCircle(200, 200, 150, paint);
paint.setARGB(100, 24, 75, 200);
canvas.drawCircle(200, 200, 160, paint);
paint.setColor(Color.YELLOW);
paint.setTextSize(24);

canvas.drawText("水温22度", 150, 200, paint);
canvas.drawLine(0, 0, 300, 300, paint);
}
}

2.在继承SurfaceView的类中即使重写了onDraw()方法也是没有用的,因为SurfaceView虽然继承自View,但并没
重写onDraw(),其子类可以重写onDraw()但并不能自动调用,并且调用时会抛出异常

package com.lzh.study;

import android.content.Context;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;

public class TestSurface extends SurfaceView implements Callback {
GameThread gameThread;

public TestSurface(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO 自动生成的构造函数存根
SurfaceHolder surfaceHolder = getHolder();
// 添加回调对象
surfaceHolder.addCallback(this);
gameThread = new GameThread(surfaceHolder);;
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO 自动生成的方法存根

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO 自动生成的方法存根
gameThread.start();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO 自动生成的方法存根

}

class GameThread extends Thread {
SurfaceHolder surfaceHolder;
// run()函数中控制循环的参数。
boolean run = true;

public GameThread(SurfaceHolder surfaceHolder) {
this.surfaceHolder = surfaceHolder;
}

@Override
public void run() {
// TODO Auto-generated method stub
int i = 0;
while (run) {
Log.v("gameThread", "GameThread");
Canvas c = null;
try {
synchronized (surfaceHolder) {
// 我们在屏幕上显示一个计数器,每隔 1 秒钟刷新一次
c = surfaceHolder.lockCanvas();
c.drawARGB(255, 0, 255, 255);
Paint paint = new Paint();
paint.setTextSize(48);
paint.setColor(Color.RED);
c.drawText("" + i++, 200,500, paint);
Thread.sleep(1000);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (c != null) {
surfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
}
}

结果如下图

android 之 surfaceView和普通View的重绘使用的更多相关文章

  1. 【Android】利用自己定义View的重绘实现拖动移动,获取组件的尺寸

    以下利用一个app来说明怎样利用自己定义View的重绘实现拖动移动.获取组件的尺寸. 例如以下图,触摸拖动,或者轻轻点击屏幕都能移动图片.假设碰到文字,则会弹出提示. 这里是利用自己定义View的重绘 ...

  2. [Android FrameWork 6.0源码学习] View的重绘过程

    View绘制的三部曲,  测量,布局,绘画今天我们分析测量过程 view的测量是从ViewRootImpl发起的,View需要重绘,都是发送请求给ViewRootImpl,然后他组织重绘在重绘的过程中 ...

  3. [Android FrameWork 6.0源码学习] View的重绘过程之WindowManager的addView方法

    博客首页:http://www.cnblogs.com/kezhuang/p/关于Activity的contentView的构建过程,我在我的博客中已经分析过了,不了解的可以去看一下<[Andr ...

  4. Android View的重绘过程之WindowManager的addView方法

    博客首页:http://www.cnblogs.com/kezhuang/p/ 关于Activity的contentView的构建过程,我在我的博客中已经分析过了,不了解的可以去看一下 <[An ...

  5. Android View的重绘过程之Draw

    博客首页:http://www.cnblogs.com/kezhuang/p/ View绘制的三部曲,测量,布局,绘画现在我们分析绘画部分测量和布局 在前两篇文章中已经分析过了.不了解的可以去我的博客 ...

  6. Android View的重绘过程之Measure

    博客首页:http://www.cnblogs.com/kezhuang/p/ View绘制的三部曲,  测量,布局,绘画今天我们分析测量过程 view的测量是从ViewRootImpl发起的,Vie ...

  7. Android学习Scroller(五)——具体解释Scroller调用过程以及View的重绘

    PS: 该篇博客已经deprecated,不再维护.详情请參见  站在源代码的肩膀上全解Scroller工作机制  http://blog.csdn.net/lfdfhl/article/detail ...

  8. [Android FrameWork 6.0源码学习] View的重绘过程之Draw

    View绘制的三部曲,测量,布局,绘画现在我们分析绘画部分测量和布局 在前两篇文章中已经分析过了.不了解的可以去我的博客里找一下 下面进入正题,开始分析调用以及函数原理 private void pe ...

  9. [Android FrameWork 6.0源码学习] View的重绘过程之Layout

    View绘制的三部曲,测量,布局,绘画现在我们分析布局部分测量部分在上篇文章中已经分析过了.不了解的可以去我的博客里找一下 View的布局和测量一样,都是从ViewRootImpl中发起,ViewRo ...

随机推荐

  1. 【温故而知新-Javascript】使用canvas元素(第二部分)

    本文将继续介绍canvas的功能,展示如何绘制更复杂的图形(包括圆弧和曲线),如何使用剪裁区域来限制操作以及如何绘制文本.还是介绍可以应用在画布上的特效和变换,包括阴影.透明度.旋转和坐标重映射. 1 ...

  2. 扫盲 BT Sync——不仅是同步利器,而且是【分布式】网盘

    先向大伙儿宣布个好消息-- 经过多位热心读者的大力支持,经过几天的努力,已经完成了"微软网盘"到"BitTorrent Sync"的迁移工作. 再次向这批热心读 ...

  3. 《JavaScript权威指南 第六版 中文版》(一)

    <JavaScript权威指南 第六版 中文版> 第二章 词法结构 2.1字符集 JavaScript是使用Unicode字符集编码写的. 2.1.1区分大小写 JavaScript是区分 ...

  4. using关键字的用法

    1.using 关键字可以用来导命名空间,与java中的import类似. 2.using关键字可以用来释放资源,并且被释放的资源代码是非托管代码. 既然可以释放非托管代码,那么什么是非托管代码? 我 ...

  5. 高大上的uGUI正式版发布了

    uGUI发布啦 本周期待已久的New UI System 发布了,因为这段时间项目是开发期,所以比较忙,也就没过多关注新UI了,趁着周六日有空,来瞅瞅这高大上的New UI System. PS:我也 ...

  6. JAVA中遇到 UTF-八 序列的字节 1 无效

    UTF-8 序列的字节 1 无效用dom4j操作xml文件, 出现了这个错误.原因是xml文件被创建的时候是ansi码格式. (   UTF-8 序列的字节 1 无效用dom4j操作xml文件, 出现 ...

  7. Maven系列一pom.xml 配置详解

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  8. 虚拟机软件VMware Workstation Pro的安装与使用

    聚焦行业最佳实践,BDTC 2016完整议程公布      Java 编程入门(系列)      程序员11月书讯,评论得书啦      免费的知识库,你的知识库 虚拟机软件VMware Workst ...

  9. Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例

    概要 这一章,我们对HashMap进行学习.我们先对HashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashMap.内容包括:第1部分 HashMap介绍第2部分 HashMa ...

  10. SQL server 专业词汇

    sql组成:DDL:数据库模式定义语言,关键字:createDML:数据操纵语言,关键字:Insert.delete.updateDCL:数据库控制语言 ,关键字:grant.removeDQL:数据 ...