
package com.TestSurefaceView;
import java.util.Random;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class TestSurefaceView extends Activity {
MySurfaceView mySurfaceView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mySurfaceView = new MySurfaceView(this);
setContentView(mySurfaceView);
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
mySurfaceView.onResumeMySurfaceView();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
mySurfaceView.onPauseMySurfaceView();
}
class MySurfaceView extends SurfaceView implements Runnable{
Thread thread = null;
SurfaceHolder surfaceHolder;
volatile boolean running = false;
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
Random random;
volatile boolean touched = false;
volatile float touched_x, touched_y;
public MySurfaceView(Context context) {
super(context);
// TODO Auto-generated constructor stub
surfaceHolder = getHolder();
random = new Random();
}
public void onResumeMySurfaceView(){
running = true;
thread = new Thread(this);
thread.start();
}
public void onPauseMySurfaceView(){
boolean retry = true;
running = false;
while(retry){
try {
thread.join();
retry = false;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public void run() {
// TODO Auto-generated method stub
while(running){
if(surfaceHolder.getSurface().isValid()){
Canvas canvas = surfaceHolder.lockCanvas();
//... actual drawing on canvas
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(3);
int w = canvas.getWidth();
int h = canvas.getHeight();
int x = random.nextInt(w-1);
int y = random.nextInt(h-1);
int r = random.nextInt(255);
int g = random.nextInt(255);
int b = random.nextInt(255);
paint.setColor(0xff000000 + (r << 16) + (g << 8) + b);
canvas.drawPoint(x, y, paint);
if(touched){
paint.setStrokeWidth(50);
paint.setColor(Color.BLACK);
canvas.drawPoint(touched_x, touched_y, paint);
}
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
touched_x = event.getX();
touched_y = event.getY();
int action = event.getAction();
switch(action){
case MotionEvent.ACTION_DOWN:
touched = true;
break;
case MotionEvent.ACTION_MOVE:
touched = true;
break;
case MotionEvent.ACTION_UP:
touched = false;
break;
case MotionEvent.ACTION_CANCEL:
touched = false;
break;
case MotionEvent.ACTION_OUTSIDE:
touched = false;
break;
default:
}
return true; //processed
}
}
}
Related Post:
- A basic implementation of SurfaceView
- Drawing on SurfaceView
- Detect multi-touch, on SurfaceView
- Draw path on SurfaceView's canvas
nice to have someone do a basic surfaceview primer, particularly as it's tied in with threading. the desciption in the docs is short and cryptic.
ReplyDeleteHi
ReplyDeleteExcellent tutorial, thanks for sharing your knowledge, I have a
query ... I add an opaque background and an image on the view (macro)...but when I
take a photo not recorded...have any idea how to do this
this is the image http://dl.dropbox.com/u/46059390/fotos/imageOverlayAndroid.JPG
Deletethe upper image is in main.xml and the other in the same control.xml
Hi
ReplyDeleteThanks for the tutorial and can we add a surfaceview into the live camera view with the onTouch Event???
Hi.. thanks for the code.. it helps me to get started... i have a question. i try to do some modifications to meet my need. i deleted the random point drawing and changed it to draw lines. but when i executed on my Galaxy Tab it shows me that the line drew was blinking.. do you have any idea why this is happen? thanks...
ReplyDeleteandre.. acl.fisika@gmail.com
It's because of double buffer of SurfaceView.
DeletePlease read Flickering problems due to double buffer of SurfaceView.
Thanks for the info... i'll look up to it...
Deletehow to create 8 points in surface view and the points must be flexible
ReplyDeletePlease read Detect multi-touch, on SurfaceView.
Delete