I have an XML layout and want to add my own custom SurfaceView to it and draw on its canvas. When I debug, the canvas runs its onDraw and gets to unlockandpost function, but its always just a black screen. Here is my code. I’ve been trying to figure it out for hours and have tried multiple alternatives such as just adding my custom SurfaceView into the XML instead of adding it dynamically, but I got the same results.
Any help would be appreciated,
Thank you.
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/white"
>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/guitar_neck">
</ImageView>
<RelativeLayout
android:id="@+id/letter_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
public class BeginGame extends Activity implements OnClickListener {
public RelativeLayout game_screen;
public LetterBar theBar;
public SurfaceHolder holder;
public static int width, height;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
theBar = new LetterBar(this);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Display display = getWindowManager().getDefaultDisplay();
width = display.getWidth(); // deprecated
height = display.getHeight(); // deprecated
setContentView(R.layout.game_menu);
game_screen = (RelativeLayout)findViewById(R.id.letter_bar);
game_screen.addView(theBar);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
}
public class LetterBar extends SurfaceView implements SurfaceHolder.Callback {
private int width, height, toneWidth, toneHeight;
private Paint backgroundPaint, paint;
private Resources res;
private Drawable myImage;
private Bitmap neck, b;
private LetterThread _thread;
public LetterBar(Context context) throws IOException {
super(context);
// TODO Auto-generated constructor stub
getHolder().addCallback(this);
_thread = new LetterThread(getHolder(), this);
paint = new Paint();
paint.setColor(0xFFFFFF);
backgroundPaint = new Paint();
backgroundPaint.setARGB(0, 255, 255, 255);
res = context.getResources();
neck = BitmapFactory.decodeFile("/assets/guitar_neck.gif");
InputStream bitmap=null;
b = BitmapFactory.decodeResource(context.getResources(), R.drawable.guitar_neck);
toneWidth = b.getWidth();
toneHeight = b.getHeight();
}
@Override
public void onDraw(Canvas canvas){
canvas.drawText("TEST", 20, 20, paint);
canvas.drawBitmap(b, 0, 0, paint);
}
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
setWillNotDraw(false);
_thread.setRunning(true);
_thread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// simply copied from sample application LunarLander:
// we have to tell thread to shut down & wait for it to finish, or else
// it might touch the Surface after we return and explode
boolean retry = true;
_thread.setRunning(false);
while (retry) {
try {
_thread.join();
retry = false;
} catch (InterruptedException e) {
// we will try it again and again...
}
}
}
}
public class LetterThread extends Thread {
private SurfaceHolder _surfaceHolder;
private LetterBar letter_bar;
private boolean _run = false;
public LetterThread(SurfaceHolder surfaceHolder, LetterBar bar) {
_surfaceHolder = surfaceHolder;
letter_bar = bar;
}
public void setRunning(boolean run) {
_run = run;
}
@Override
public void run() {
Canvas c;
while (_run) {
c = null;
try {
c = _surfaceHolder.lockCanvas(null);
synchronized (_surfaceHolder) {
letter_bar.onDraw(c);
}
} finally {
// do this in a finally so that if an exception is thrown
// during the above, we don't leave the Surface in an
// inconsistent state
if (c != null) {
_surfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
}
Currently your
paintandbackgroundPaintboth have alpha0.Try this: