
package com.TestSurefaceView;
import java.util.Random;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Bundle;
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;
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);
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
}
}
Related Post:
- Handle onTouchEvent in SurfaceView
- Draw path on SurfaceView's canvas
Thanks for the simple examples I like your posts.
ReplyDeletehey please can you tell me how to record this SurfaceView so that i can play it later on when required.
ReplyDeletehello,,
ReplyDeletecould you please tell me how to change the SurfaceView
parameters like this
[surfaceView.setLayoutParams(new FrameLayout.LayoutParams(X,Y));]
I want make like this to do zoom ,,
Many thanks
Anas
what about drawing on top of a surfaceview background image, like with drawRect.
ReplyDeleteA general question: All SurfaceView implementations I saw so far use a thread which continously draws in an infinite loop. However, in many apps the image only changes after some user event, so redrawing the same image over and over again seems a big waste of CPU power. How could we implement some Invalidate() / OnDraw() scheme, where drawing only takes places after a user event? (But still use a second thread to keep the load from the main GUI thread...)
ReplyDeleteHermann, just inherit your view from View and implement onDraw()
Deleteterrible graphic animation skills ! just joking. thanks, this helped me a lot
ReplyDeletesourav bor phukon's comment is hilarious !
ReplyDeletethanks for it, Can you help me ?, Actually i have a problem
ReplyDeleteon canvas on surface view. The problem is that when i touch screen for drawing then drawing not shown but when release the finger from the screen then drawing has seen.
my email-hemant.katariya26@gmail.com
My small code is
public boolean onTouch(View view, MotionEvent motionEvent) {
if(motionEvent.getAction() == MotionEvent.ACTION_DOWN){
currentDrawingPath = new DrawingPath();
currentDrawingPath.paint = currentPaint;
currentDrawingPath.path = new Path();
currentBrush.mouseDown(currentDrawingPath.path, motionEvent.getX(), motionEvent.getY());
}else if(motionEvent.getAction() == MotionEvent.ACTION_MOVE){
currentBrush.mouseMove( currentDrawingPath.path, motionEvent.getX(), motionEvent.getY() );
}else if(motionEvent.getAction() == MotionEvent.ACTION_UP){
currentBrush.mouseUp( currentDrawingPath.path, motionEvent.getX(), motionEvent.getY() );
drawingSurface.addDrawingPath(currentDrawingPath);
}
return true;
}
hello,
DeleteI don't know the details of your DrawingPath.
Please read my simple example: Draw path on SurfaceView's canvas.
Cool :D!
ReplyDeleteGreat Job, many thanks! ;)
ReplyDelete