!自定义控件式需要实现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);
}
}
}
}
}
}

结果如下图

最新文章

  1. map 与 unordered_map
  2. 获取父iframe的高宽
  3. Android测试框架初步
  4. IoC容器Autofac - Autofac + Asp.net MVC + EF Code First(转载)
  5. 解决ibus图标为红圈(图标丢失)
  6. poj2975(nim游戏取法)
  7. C语言关键字 - 铁布衫:const 转载
  8. HDOJ(HDU) 2162 Add ‘em(求和)
  9. Time Complexity Big-O
  10. vue中使用provide和inject刷新当前路由(页面)
  11. DSAPI多功能组件编程应用-图形图像篇(中)
  12. Delphi 数据导出到Excel
  13. tamptermonkey 脚本初步尝试
  14. [py][mx]django的cookie和session操作-7天免登录
  15. hfrk2410_a1.1开发板移植linux-2.6.32.27--网卡篇(cs8900)
  16. SqlServer自定义函数Function中调用with as
  17. 【Python】【元编程】【三】【元类】
  18. controller中两个方法之间共享一个变量LinkedHashMap
  19. python2和python3同时存在如何安装和使用pip
  20. Thinkphp整合各个功能

热门文章

  1. 浅析Java中的访问权限控制
  2. UESTC-第五届ACM趣味程序设计竞赛第四场(正式赛)--不完全解题报告
  3. Codeforces 460D Little Victor and Set --分类讨论+构造
  4. Java中的ReentrantLock和synchronized两种锁定机制的对比
  5. nginx作为负载均衡服务器——测试
  6. SAE上安装第三方模块
  7. 在SecureCRT中使用rz和sz传输文件
  8. mysql游标循环的使用
  9. GIT常用命令备忘
  10. (原创)解决远程桌面连接远程应用时,出现 &#39;应用程序错误: &#39;0x7c931780&#39;指令引用的 &#39;0x89abcdef&#39; 内存。该内存不能为 &#39;read&#39;&quot;