简介:SurfaceView继承自View,但它与View不同,View是在UI主线程中更新画面,而SurfaceView是在一个新线程中更新画面,View的特性决定了其不适合做动画,因为如果更新画面时间过长,那么UI线程就会被正在画的函数阻塞,所以Android通常用SurfaceView做动画效果。

下面给出一个使用SurfaceView做的简单例子:

package com.yw.myapiupdate.mydraw;

import android.app.Activity;
import android.os.Bundle;
import android.view.Display; /**
*
* @author yw-tony
*
*/
public class MyDrawActivity extends Activity{
private SurfaceViewBall ball ;
private int width = 0;
private int height = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Display display = getWindowManager().getDefaultDisplay();
width = display.getWidth();
height = display.getHeight(); ball = new SurfaceViewBall(this,width,height);
/*ball.setOnTouchListener(new OnTouchListener() {
float x = 0;
float y = 0;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_DOWN://按下 ball.drawThread.top += event.getY();
ball.drawThread.left += event.getX();
ball.drawThread.buttom += event.getY();
ball.drawThread.right += event.getX();
break;
case MotionEvent.ACTION_MOVE://移动
//基于xy为圆心移动
//得到手指的坐标(x,y)
x = event.getRawX();
y = event.getRawY();
x = ((ball.drawThread.right - ball.drawThread.left)/2);
y = (ball.drawThread.buttom - ball.drawThread.top)/2; ball.drawThread.top = (int) (event.getRawY()+y);
ball.drawThread.left = (int) (event.getRawX()+x);
ball.drawThread.right = (int)(200+event.getX()+x);
ball.drawThread.buttom = (int)(200+event.getY()+y); log.e("getRawX", ""+event.getRawX());
log.e("getRawY", ""+event.getRawY());
log.e("getX", ""+event.getX());
log.e("getRawY", ""+event.getY()); // ball.drawThread.top += 20;
// ball.drawThread.left += event.getRawX();
// ball.drawThread.buttom += event.getRawY();
// ball.drawThread.right += event.getRawX();
break;
case MotionEvent.ACTION_UP://弹起
ball.drawThread.top += 20;
ball.drawThread.buttom += 20;
ball.drawThread.top += event.getRawY();
ball.drawThread.left += event.getRawX();
ball.drawThread.buttom += event.getRawY();
ball.drawThread.right += event.getRawX();
break;
}
return true;
}
});*/
setContentView(ball);
}
/**
* 屏幕触摸事件
*/
/*@Override
public boolean onTouchEvent(MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_DOWN://按下
ball.drawThread.top += event.getY();
ball.drawThread.left += event.getX();
ball.drawThread.buttom += event.getY();
ball.drawThread.right += event.getX();
break;
case MotionEvent.ACTION_MOVE://移动
ball.drawThread.top += event.getRawY();
// ball.drawThread.left += event.getRawX();
// ball.drawThread.buttom += event.getRawY();
// ball.drawThread.right += event.getRawX();
break;
case MotionEvent.ACTION_UP://弹起
ball.drawThread.top += event.getRawY();
ball.drawThread.left += event.getRawX();
ball.drawThread.buttom += event.getRawY();
ball.drawThread.right += event.getRawX();
break;
} return true;
}*/
@Override
public void onBackPressed() {
ball.drawThread.isRun = false;
super.onBackPressed();
}
}

MySurfaceView.java

package com.yw.myapiupdate.mydraw;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.SurfaceHolder;
import android.view.SurfaceView; public class SurfaceViewBall extends SurfaceView implements SurfaceHolder.Callback{
private SurfaceHolder holder;
public DrawThread drawThread ;
private int width = 0;//屏幕宽度
private int height = 0;//屏幕高度
public SurfaceViewBall(Context context,int width ,int height) {
super(context);
holder = this.getHolder();//得到surfaceHolder对象
//给holder添加回调函数
holder.addCallback(this);
drawThread = new DrawThread(holder);
this.width = width;
this.height = height;
}
/**
* 当视图发生改变时执行
*/
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) { }
/**
* 当创建视图时执行
*/
@Override
public void surfaceCreated(SurfaceHolder holder) {
drawThread.isRun = true;
drawThread.start();
}
/**
* 当视图销毁时执行
*/
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
drawThread.isRun = false;
}
/**
* 绘制图像的线程
* @author yw-tony
*
*/
class DrawThread extends Thread{
private SurfaceHolder drawHolder;
public boolean isRun;
public int top = 50;
public int buttom = 250;
public int left = 100;
public int right = 300 ;
public DrawThread(SurfaceHolder drawHolder){
this.drawHolder = drawHolder;
}
@Override
public void run() {
int count = 0;
boolean target = false;
boolean targetHeightFlag = false;
while(isRun){
Canvas canvas = null;
try{
synchronized (SurfaceViewBall.class) {
canvas = drawHolder.lockCanvas();//锁定画布
canvas.drawColor(Color.BLACK);//设置画布颜色
//创建画笔
Paint paint = new Paint();
paint.setTextSize(20.00f);
//设置画笔颜色为白色
paint.setColor(Color.WHITE);
//创建矩形区域
/*left = left +20;
right = right + 20;*/
/*对矩形左右两边进行碰撞检测*/
if(left <= 0){//如果碰到左边界,则向右边移动
left = left +20;
right = right +20;
target = false;
}else if(right >= width){//如果碰到右边界则向左边移动
left = left -20;
right = right - 20;
target = true;
}else{
if(target){
left = left -20;
right = right - 20;
}else{
left = left +20;
right = right + 20;
} }
/*对矩形上下两边进行碰撞检测*/
if(top<=0){//如果矩形碰到顶部
top = top+10;
buttom = buttom + 10;
targetHeightFlag = false;
}else if(buttom >= height){//如果矩形碰到底部
top = top-10;
buttom = buttom - 10;
targetHeightFlag = true;
}else{//按正常流程执行
if(targetHeightFlag){
top = top-10;
buttom = buttom - 10;
}else{
top = top+10;
buttom = buttom + 10;
}
} Rect rect = new Rect(left,top,right,buttom);
//绘制矩形区域
canvas.drawRect(rect, paint);
//绘制字体
canvas.drawText("这是第"+(count++)+"秒", 100, 300, paint);
//休眠时间为1秒
if(canvas != null){
holder.unlockCanvasAndPost(canvas);//结束画布锁定,并提交改变
}
Thread.sleep(50);
}
}catch(Exception e){ }finally{
}
}
}
} }

Android SurfaceView概述的更多相关文章

  1. Android SurfaceView实战 带你玩转flabby bird (下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43063331,本文出自:[张鸿洋的博客] 1.概述 在Android Surfa ...

  2. Android SurfaceView实战 带你玩转flabby bird (上)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/42965779 ,本文出自:[张鸿洋的博客] 1.概述 哈,记得以前写过Andro ...

  3. Android SurfaceView vs TextureView

    Android SurfaceView vs TextureView https://github.com/crosswalk-project/crosswalk-website/wiki/Andro ...

  4. Android SurfaceView 绘图覆盖刷新及脏矩形刷新方法

    http://www.cnblogs.com/SkyD/archive/2010/11/08/1871423.html Android SurfaceView 绘图覆盖刷新及脏矩形刷新方法 Surfa ...

  5. [Learn Android Studio 汉化教程]第二章:Android Studio概述(一)

    [Learn Android Studio ]第二章:Android Studio概述(一) Android Studio是一个视窗化的开发环境.为了充分利用有限的屏幕空间,不让你束手束脚,Andro ...

  6. Android数据加密概述及多种加密方式 聊天记录及账户加密 提供高质量的数据保护

    Android数据加密概述及多种加密方式 聊天记录及账户加密 提供高质量的数据保护 数据加密又称password学,它是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文.而解密则是通过解密 ...

  7. Android SurfaceView内容获取

    Android SurfaceView内容获取 这几天在做一个Android的小项目,项目中需要使用到SurfaceView来显示相机捕获的内容,同时还有一个SurfaceView用于绘制一些辅助线, ...

  8. android视图概述

    android视图概述 一.简介 数据和控件分开的作用: 便于引用 便于修改:修改的时候直接改一次数据就可以了

  9. Android零基础入门第33节:Android事件处理概述

    原文:Android零基础入门第33节:Android事件处理概述 通过对Android基本组件的学习,也有接触少部分Android的事件处理,比如按钮的点击事件.选框的状态切换事件. 一.Andro ...

随机推荐

  1. 用01随机函数构造[a,b]整数范围随机数

    #include <stdio.h> #include <stdlib.h> #define RAND_0_1 (rand()&0x1) int random(int ...

  2. [js常用]页面滚动的顶部,指定位置或底部,平滑滚动

    js平滑滚动到顶部.底部.指定地方 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  3. BZOJ5289: [Hnoi2018]排列

    传送门 第一步转化,令 \(q[p[i]]=i\),那么题目变成: 有一些 \(q[a[i]]<q[i]\) 的限制,\(q\) 必须为排列,求 \(max(\sum_{i=1}^{n}w[i] ...

  4. JavaSE——线程同步

    为什么需要线程同步? 同步就是协同步调,按预定的先后次序进行运行.如:你说完,我再说而并非一起动作.“同”字应是指协同.协助.互相配合. 如进程.线程同步,可理解为进程或线程A和B一块配合,A执行到一 ...

  5. JetBrains PhpStorm 2017.2 x64 激活

    使用方法:激活时选择License server 填入http://idea.imsxm.com 点击Active即可

  6. [Android] Spinners介绍及用法

    本文地址:http://www.cnblogs.com/rossoneri/p/4366018.html Spinners介绍 Spinners提供了从一个集(set)中选择某个值(value)的一个 ...

  7. LeetCode题解之Binary Tree Tilt

    1.题目描述 2.分析 利用递归实现. 3.代码 int findTilt(TreeNode* root) { if (root == NULL) ; ; nodesTilt(root,ans); r ...

  8. 单例模式实现 Volitile , interlocked

    //单例模式: //1. 双检锁机制 Volatile.write() //2. 静态变量 //3. Interlocked.CompareExchange(ref single, temp, nul ...

  9. THE ELEMENTS OF C# STYLE

    |前言 程序员其实艺术家,灵动的双手如行云流水般在键盘上创造着生命的奇迹,我认为代码是有灵魂的.同一个模块,在每个程序员手中所缔造出来的是不相同的. 最终,这个模块或者实现了最初的业务,但是回过头看看 ...

  10. 从外部导入django模块

    import os import sys sys.path.append("D:\\pyweb\\sf"); # 项目位置(不是app) os.environ.setdefault ...