Android Surface Viewの概要
19935 ワード
概要:Surface ViewはViewから継承されていますが、Viewとは異なり、ViewはUIマスタースレッドで画面を更新しますが、Surface Viewは新しいスレッドで画面を更新します.Viewの特性は、画面を更新するのに適していないことを決定します.画面を更新する時間が長すぎると、UIスレッドは描かれている関数でブロックされるため、Androidは通常Surface Viewでアニメーション効果を行います.
以下に、Surface Viewを使用した簡単な例を示します.
MySurfaceView.java
以下に、Surface Viewを使用した簡単な例を示します.
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{
}
}
}
}
}