surfaceView画图
1、视图
<LinearLayout 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"
android:orientation="vertical"
> <Button
android:id="@+id/bt_clear"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="清空"
/>
<com.zyhui.zyhsurfaceview.ZyhSurfaceView
android:id="@+id/zyh_sfv"
android:layout_width="match_parent"
android:layout_height="match_parent"
/> </LinearLayout>
2、MainActivity
package com.zyhui.zyhsurfaceview; import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.app.Activity; public class MainActivity extends Activity implements OnClickListener { private ZyhSurfaceView zyh_sfv; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
zyh_sfv = (ZyhSurfaceView) findViewById(R.id.zyh_sfv);
Button button = (Button) findViewById(R.id.bt_clear);
button.setOnClickListener(this);
} @Override
public void onClick(View v) {
zyh_sfv.clear();
} }
3、自定义surfaceView控件
package com.zyhui.zyhsurfaceview; import java.util.ArrayList;
import java.util.List;
import java.util.Random; import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView; //====================================
//1、继承SurfaceView
//2、监听SurfaceView的生命周期
//3、自定义线程
//4、自定义线程需要的参数
//5、监听线程的生命周期
//6、通过SurfaceView的生命周期来执行我们的线程
//7、添加触摸事件
//
//主要是通过线程把图片画进holder中,这样它就会显示出来;
//如果直接在HandlerThread线程中更新ui控件是不行,它会报错的
//====================================
public class ZyhSurfaceView extends SurfaceView implements Callback { private DrawingThread drawingThread; public ZyhSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
initParams();
} public ZyhSurfaceView(Context context) {
super(context);
initParams();
} private void initParams(){
//监听SurfaceView的生命周期
getHolder().addCallback(this);
} @Override
public void surfaceCreated(SurfaceHolder holder) {
drawingThread = new DrawingThread(getHolder(),
BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher));
drawingThread.start();
} @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
//Log.i("zyh", width + "-----" + height);
this.drawingThread.updateSize(width, height);//更新宽和高
} @Override
public void surfaceDestroyed(SurfaceHolder holder) {
this.drawingThread.quit();
this.drawingThread = null;
} @Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
this.drawingThread.addItem(event.getX(), event.getY());
}
return super.onTouchEvent(event);
} //清空图片
public void clear(){
this.drawingThread.clear();
} //自定义线程
private class DrawingThread extends HandlerThread implements android.os.Handler.Callback{
private static final int MSG_ADD = 101;//添加消息
private static final int MSG_MOVE = 102;//消息移动
private static final int MSG_CLEAR = 103;//清空 //定义SurfaceView的宽和高
private int drawingWidth,drawingHeight; //缓存视图
private SurfaceHolder drawingHolder;
//画笔
private Paint paint;
//需要绘制的图片
private Bitmap iconBitmap;
//图片对象数组
private List<DrawingItem> locations;
//更新ui的Handler
private Handler receiver;
//线程是否在运行
private boolean isRunning = false; public DrawingThread(SurfaceHolder drawingHolder, Bitmap bitmap) {
super("DrawingThread");
this.drawingHolder = drawingHolder;
this.iconBitmap = bitmap;
this.locations = new ArrayList<DrawingItem>();
this.paint = new Paint(Paint.ANTI_ALIAS_FLAG);
} //监听线程的生命周期
@Override
protected void onLooperPrepared() {
super.onLooperPrepared();
this.receiver = new Handler(getLooper(),this);
this.isRunning = true;
this.receiver.sendEmptyMessage(MSG_ADD);
} @Override
public boolean quit() {
this.isRunning = false;
this.receiver.removeCallbacksAndMessages(null);//移除消息
return super.quit();
} public void updateSize(int width, int height){
this.drawingWidth = width;
this.drawingHeight = height;
} public void addItem(float x, float y){
Message msg = Message.obtain(receiver, MSG_ADD, (int)x, (int)y);
this.receiver.sendMessage(msg );
} public void clear(){
this.receiver.sendEmptyMessage(MSG_CLEAR);
} private class DrawingItem{
private int x,y;
private boolean isVertical,isHorizontal;
public DrawingItem(int x, int y, boolean isVertical,
boolean isHorizontal) {
this.x = x;
this.y = y;
this.isVertical = isVertical;
this.isHorizontal = isHorizontal;
} } @Override
public boolean handleMessage(Message msg) {
switch(msg.what){
case MSG_ADD:
Random random = new Random();
DrawingItem drawingItem = new DrawingItem(msg.arg1,msg.arg2,
random.nextBoolean(),random.nextBoolean());
locations.add(drawingItem);
break;
case MSG_MOVE:
if(!isRunning){
return true;
}
//获取枷锁画布
Canvas lockCanvas = this.drawingHolder.lockCanvas();
if(lockCanvas == null){
break;
}
lockCanvas.drawColor(Color.BLACK);
for(DrawingItem item : locations){
item.x += item.isHorizontal ? 5 : -5;
if(item.x > this.drawingWidth - iconBitmap.getWidth()){
item.isHorizontal = false;
}else{
item.isHorizontal = true;
} item.y += item.isVertical ? 5 : -5;
if(item.y > this.drawingHeight - iconBitmap.getHeight()){
item.isVertical = false;
}else{
item.isVertical = true;
} //绘图
lockCanvas.drawBitmap(iconBitmap, item.x, item.y, paint);
} this.drawingHolder.unlockCanvasAndPost(lockCanvas);//释放
//Log.i("zyh", Thread.currentThread().getName());
break;
case MSG_CLEAR:
//清空图片
locations.clear();
break;
default:
break;
} if(isRunning){
this.receiver.sendEmptyMessage(MSG_MOVE);//促使图片的移动
}
return false;
}
}
}
//画图程序:handleMessage
//画出的图之所以能够显示是因为通过SurfaceView的holder来获取画布
surfaceView画图的更多相关文章
- SurfaceView 使用demo 飞机游戏小样
本demo 主要使用了surfaceview 画图. 1.在线程中对canvas操作. 2.实现画图 3.surfaceView 继承了view 可以重写ontouchevent方法来操作输入. 代码 ...
- 如何自学Android--转
原文地址:http://blog.csdn.net/lavor_zl/article/details/51217319 1. Java知识储备 本知识点不做重点讲解: 对于有基础的同学推荐看<J ...
- Android 涂鸦最佳实践
Android中实现手势画图一般都两种方式,一是直接在View上绘制,而是使用SurfaceView. 两者还是有一些差别的.简介下. View:显示视图,内置画布,提供图形绘制函数.触屏事件.按键事 ...
- 如何自学 Android 的?
http://android.jobbole.com/83380/ 1. Java知识储备 本知识点不做重点讲解:对于有基础的同学推荐看<Java编程思想>,巩固基础,查漏补全,了解并熟悉 ...
- Android如何自学----转自lavor从segmentfault
如何自学Android 1. Java知识储备 本知识点不做重点讲解: 对于有基础的同学推荐看<Java编程思想>,巩固基础,查漏补全,了解并熟悉更多细节知识点. 对于没有基础的同学推荐看 ...
- Android代码速查,写给新手的朋友们[转]
原文地址:http://www.open-open.com/lib/view/open1397286499090.html 0 android 创建按钮 Button button = new But ...
- Android SurfaceView实现静态于动态画图效果
本文是基于Android的SurfaceView的动态画图效果,实现静态和动态下的正弦波画图,可作为自己做图的简单参考,废话不多说,先上图, 静态效果: 动态效果: 比较简单,代码注释的也比较详细,易 ...
- android surfaceView 的简单使用 画图,拖动效果
前面说到了画图,其实更好的就是使用 surfaceView了. surfaceView 继承于 View,View里面嵌套了一个专门用于画图的 surface, 对于一个View的onDraw()方法 ...
- Android 画图类View与SurfaceView之学习
在开发游戏开发中,android相应的提供了几个重要的模块: 1.显示界面的视图: Android 提供 View 和 SurfaceView 2.控制游戏整体结构: android 提供 Acti ...
随机推荐
- mysql下的SELECT INTO语句
在mysql下使用SELECT INTO语句会产生ERROR 1327 (42000): Undeclared variable:new_tablename 此时要使用: CREATE TABLE C ...
- UBER司机奖励政策
高峰时段: 早高峰:早6:30-8:30点 晚高峰:晚4:00-7:00点 *周六日只有晚高峰 其他时间均为平峰时段 滴滴快车单单2.5倍,注册地址:http://www.udache.com/如何注 ...
- Android API 中文(76)——AdapterView.OnItemLongClickListener
前言 本章内容是android.widget.AdapterView.OnItemLongClickListener,版本为Android 2.3 r1,翻译来自"cnmahj", ...
- Decorator Pattern(装饰模式)
装饰模式:动态的给一个对象添加一些额外的职责.当然我们也可以通过继承来实现类似的功能,但是随着子类的增多,各种子类的组合会造成子类的急剧膨胀. Requirement: 假设客户有一个要求,需要打一个 ...
- CAEmitterLayer 粒子发射器
在iOS 5中,苹果引入了一个新的CALayer子类叫做CAEmitterLayer.CAEmitterLayer是一个高性能的粒子引擎,被用来创建实时例子动画如:烟雾,火,雨等等这些效果. CAEm ...
- Android 屏幕尺寸知识
转自:http://www.zcool.com.cn/article/ZNjI3NDQ=.html 1.了解几个概念 (1)分辨率.分辨率就是手机屏幕的像素点数,一般描述成屏幕的“宽×高”,安卓手机屏 ...
- poj 1838
http://poj.org/problem?id=1838 并查集,,,计算总共个数的模版..... #include <iostream> #define maxn 16006 #in ...
- 高质量程序设计指南C/C++语言——C++/C常量
- 无法将类型“ASP.login_aspx”转换为“System.Web.UI.WebControls.Login”
今天碰上了一个很傻的问题,起码我认为是这样. 项目中首页名是:Login.aspx,编译.运行都没有出现问题. 于是打包发布网站,各项内容都配置好后,问题出现了.一运行首页面就出现下面这个错误: 编译 ...
- VC中TRACE()的用法
个人总结:最近看网络编程是碰到了TRACE语句,不知道在哪里输出,查了一晚上资料也没找出来,今天终于在CSDN上找到了,真是个高地方啊,方法如下: 1.在MFC中加入TRACE语句 2.在TOOLS- ...