Friday, December 27, 2013

Using SurfaceView

1) Create layout with surface view
eg:  activity_surface_test.xml

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   tools:context=".SurfaceTest" >

   <TextView
       android:id="@+id/surfacetitle"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:gravity="center_horizontal"
       android:text="Surface Test" />
   
   <SurfaceView
       android:id="@+id/drawingsurface"
       android:layout_below="@+id/surfacetitle"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       />
</RelativeLayout>

2) Create Activity for using surfaceview
eg: SurfaceTest.java

package com.test.surface;

import com.test.R;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.Log;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class SurfaceTest extends Activity implements SurfaceHolder.Callback, Runnable
{
public static final int DIFF = 10;
int cx, cy;
int radius = 10;
Paint cpaint, bgpaint;
int h, w;
int xdiff =DIFF;
int ydiff = DIFF;
SurfaceView sView;
SurfaceHolder holder;
Rect surfaceRect;
boolean isExit;
Thread thisThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_surface_test);
sView = (SurfaceView) findViewById(R.id.drawingsurface);
holder = sView.getHolder();
holder.addCallback(this);
thisThread = new Thread(this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.surface_test, menu);
return true;
}

@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.d("surfaceCreated", " on surfaceCreated holder "+ holder);
isExit = false;
//start the thread only if surface created
thisThread.start();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.d("surfaceDestroyed", " on surfaceDestroyed holder "+ holder);
isExit = true;
}

@Override
public void run()
{
Canvas canvas = null;
while(!isExit)
{
try
{
Thread.sleep(100);
// Get the canvas for drawing on surface
canvas = holder.lockCanvas();
// random moving circle eg
if(canvas != null)
{
if(w == 0)
{
h = canvas.getHeight();
w = canvas.getWidth();
cx = w/2;
cy = h/2;
surfaceRect = new Rect(0,0,w,h);
cpaint = new Paint();
cpaint.setColor(Color.RED);
bgpaint = new Paint();
bgpaint.setColor(Color.BLACK);
}
canvas.drawRect(surfaceRect, bgpaint);
canvas.drawCircle(cx, cy, radius, cpaint);
}
if((cx - radius) <= 0)
{
xdiff = DIFF;
}
else if((cx + radius) >= w)
{
xdiff = -DIFF;
}
if((cy - radius) <= 0)
{
ydiff = DIFF;
}
else if((cy + radius) >= h)
{
ydiff = -DIFF;
}
cx += xdiff;
cy += ydiff;
}
catch(Exception e)
{
Log.d("run method", e.toString());
}
finally
{
if(canvas != null)
{
// publish the drawing
holder.unlockCanvasAndPost(canvas);
}
}
}
}

}


No comments:

Post a Comment