android 之 surfaceView和普通View的重绘使用
!自定义控件式需要实现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的重绘使用的更多相关文章
- 【Android】利用自己定义View的重绘实现拖动移动,获取组件的尺寸
以下利用一个app来说明怎样利用自己定义View的重绘实现拖动移动.获取组件的尺寸. 例如以下图,触摸拖动,或者轻轻点击屏幕都能移动图片.假设碰到文字,则会弹出提示. 这里是利用自己定义View的重绘 ...
- [Android FrameWork 6.0源码学习] View的重绘过程
View绘制的三部曲, 测量,布局,绘画今天我们分析测量过程 view的测量是从ViewRootImpl发起的,View需要重绘,都是发送请求给ViewRootImpl,然后他组织重绘在重绘的过程中 ...
- [Android FrameWork 6.0源码学习] View的重绘过程之WindowManager的addView方法
博客首页:http://www.cnblogs.com/kezhuang/p/关于Activity的contentView的构建过程,我在我的博客中已经分析过了,不了解的可以去看一下<[Andr ...
- Android View的重绘过程之WindowManager的addView方法
博客首页:http://www.cnblogs.com/kezhuang/p/ 关于Activity的contentView的构建过程,我在我的博客中已经分析过了,不了解的可以去看一下 <[An ...
- Android View的重绘过程之Draw
博客首页:http://www.cnblogs.com/kezhuang/p/ View绘制的三部曲,测量,布局,绘画现在我们分析绘画部分测量和布局 在前两篇文章中已经分析过了.不了解的可以去我的博客 ...
- Android View的重绘过程之Measure
博客首页:http://www.cnblogs.com/kezhuang/p/ View绘制的三部曲, 测量,布局,绘画今天我们分析测量过程 view的测量是从ViewRootImpl发起的,Vie ...
- Android学习Scroller(五)——具体解释Scroller调用过程以及View的重绘
PS: 该篇博客已经deprecated,不再维护.详情请參见 站在源代码的肩膀上全解Scroller工作机制 http://blog.csdn.net/lfdfhl/article/detail ...
- [Android FrameWork 6.0源码学习] View的重绘过程之Draw
View绘制的三部曲,测量,布局,绘画现在我们分析绘画部分测量和布局 在前两篇文章中已经分析过了.不了解的可以去我的博客里找一下 下面进入正题,开始分析调用以及函数原理 private void pe ...
- [Android FrameWork 6.0源码学习] View的重绘过程之Layout
View绘制的三部曲,测量,布局,绘画现在我们分析布局部分测量部分在上篇文章中已经分析过了.不了解的可以去我的博客里找一下 View的布局和测量一样,都是从ViewRootImpl中发起,ViewRo ...
随机推荐
- .Net程序员Python之道---Python基础
最近对动态语言比较好奇.所以选择了学习Python这门语言.话不多说开始学习笔记. 一. Python 基础: 1. print对Python进行数据输出, #号后面是队友的输出结果, 通过encod ...
- C#基础--基于POP3协议的邮件接收和基于STMP的邮件发送
最近在用outlook同步邮件.对邮件协议有一点兴趣.于是就去收集了一些资料,学习了一下如何通过.net来实现邮件的收发. 一:SMTP协议 1.什么是SMTP协议: SMTP目前 ...
- 用pygame学习初级python(二) 15.5.11
闲得无聊,对第一版的东西做了一些修改,让它更像一个游戏,也具有一些可玩性. 项目的github地址:https://github.com/lfkdsk/BrainHole_pygame 1.人物类进行 ...
- mysql中文乱码问题总结
起因:此次开发工作由于电脑不能正常使用sqlserver所以改用mysql. 问题描述:mysql使用中文产生乱码 详细问题: 1.问题1:在dos界面登录数据库存入数据时如果存在中文那么不会显示. ...
- 烈焰SWF解密
SWF 解密 是用UE编辑器 改 SWF开头 的AA AA AA ,改成43 57 53 就解密了
- 嵌入式Linux驱动学习之路(七)Linux内核启动流程
编译的内核可能会很大,故这里可以压缩一下.而在内核文件中需要解压,所以就会有一段自解压代码. 在uboot启动内核的时候,调用了函数: thekernel(0,MACH_ID,params_addr ...
- php一句话后门过狗姿势万千之后门构造与隐藏【二】
第二章节主要带给大家一些后门构造思路,与安全狗文件特征检测的机制. 另外强调一下,这篇文章需要大家对于php有一定的认识. 本章节分为三大部分,第一部分针对初级,分析菜刀php代码的执行过程,较基础: ...
- TextView和EditText中的setFilters方法说明
在TextView中有一个方法public void setFilters(InputFilter[] filters),API中有一句说明:Sets the list of input filter ...
- python设计模式1:导言
<设计模式>一书总结了23个模式,依据各自的目的又被分为创建型模式(creational pattern).结构型模式(structural pattern)和行为型模式(behavior ...
- uwp项目总结