real3D를 이용하여, 3d개발을 하고있습니다.
surfaceView의 draw를 이용하여, 3d를 그리고있는데 lockCavnas()가 null을 return하네요ㅠ.ㅠ

똑같은 그림이 두개인건 신경쓰지마시고, 숫자밑에 영문자가 4x10 형태로 40개가 나타나야하는데,
원인이 뭔지모르겠는데 전부나타나지않고 랜덤하게 나타납니다.
surface view를 이용해 그리고있습니다.
package com.example.new_3d;
import java.util.ArrayList;
import java.util.Random;
...
public class ShowPwd extends Activity implements OnTouchListener {
Random rand;
Row[] row;
final int numOfRow = 4;
private int[] alphabetIDs = { R.drawable.aa, ...};
private int[] originX = { 50, 103, 187, 257, 323, 404, 484, 540, 626, 686 };
private int[] originY = { 137, 218, 300, 397 };
private int randRowX = 0;
int randInt[];
private Real3D mReal3D;
public boolean mLibraryLoaded = true;
Bitmap viewCapture;
Button btn3D;
LinearLayout rowLayout;
LinearLayout btnLayout;
private int row3D = 0;
public ArrayList<depthImage> mZArray;
private R3DImgTestView mR3DView;
private depthImage dA, dB, dC, dD, dE, dF, dG, dH, dJ, dK, dL, dM, dP, dR,
dS, dT, dU, dW, dY;
private int base = 2;
private Bitmap mBackBm;
private FrameLayout flayout;
private final int ImgCount = 10;
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
mR3DView = new R3DImgTestView(this);
flayout = new FrameLayout(this);
this.btnLayout = (LinearLayout) LayoutInflater.from(this).inflate(
R.layout.new_pass, null);
flayout.addView(mR3DView);
flayout.addView(btnLayout);
setContentView(flayout);
// setContentView(R.layout.new_pass);
mBackBm = BitmapFactory.decodeResource(getResources(), R.drawable.back);
mZArray = new ArrayList<depthImage>(10 * numOfRow);
row = new Row[numOfRow];
randInt = new int[numOfRow * 10];
rand = new Random();
LinearLayout rowLayout = (LinearLayout) findViewById(R.id.rowLayout);
Row numRow = new Row(this);
row3D = rand.nextInt(4);
dA = new depthImage(R.drawable.aa, 80, 80, 0, 50, base);
...
numRow.cell1.setBackgroundResource(numIDs[0]);
...
btn3D = (Button) findViewById(R.id.btn3D);
setRandPass();
for (int i = 0; i < randInt.length; i++) {
switch (randInt[i]) {
case 0:
mZArray.add(dA);
break;
...
} }
rowLayout.addView(numRow, new LayoutParams(LayoutParams.MATCH_PARENT,
0, 1));
flayout.setOnTouchListener(this);
for (int i = 0; i < 40; i++) {
mZArray.get(i).mesurePos(originX[i % 10], originY[i / 10]);
}
//mR3DView.draw();
mR3DView.draw(); 를 주석처리 해놓으면, 위 그림처럼 그려집니다. 원
하는대로 전부다 그려지지 않기에 다른 예제를 보면서 draw를 넣어봤더니 죽네요ㅠㅠ
public void setRandPass() {
for (int i = 0; i < numOfRow * 10; i++) {
randInt[i] = rand.nextInt(str.length);
}
}
class depthImage {
Bitmap bm;
private int depth; // depth is regarded as half of the difference
// between two images
private int resId;
private int size_w;
private int size_h;
public int pos_x, pos_y;
private int c_width, c_height;
private Paint mPaint;
private boolean mIsSelected = false;
Drawable drawable;
public depthImage(int ResID, int w, int h, int X, int Y, int depth) {
resId = ResID;
size_w = w / 2;
size_h = h;
pos_x = X / 2;
pos_y = Y;
c_width = w;
c_height = h;
this.depth = depth;
mPaint = new Paint();
}
private void getBitmap(boolean isColorImg) {
if (isColorImg)
bm = BitmapFactory.decodeResource(getResources(), resId);
}
private void releaseBitmap() {
bm.recycle();
}
...
public void mesurePos(float X, float Y) {
pos_x = (int) (X / 2 - size_w / 2);
pos_y = (int) (Y - size_h / 2);
}
public void drawOnCanvas(Canvas c, int c_width, int c_height) {
getBitmap(!mIsSelected);
if (bm != null) {
c.drawBitmap(bm, null, new Rect(pos_x + depth, pos_y, pos_x
+ depth + size_w, pos_y + size_h), mPaint);
c.drawBitmap(bm, null, new Rect(pos_x + c_width / 2 - depth,
pos_y, pos_x + c_width / 2 - depth + size_w, pos_y
+ size_h), mPaint);
}
// TO-DO
releaseBitmap();
}
}
class R3DImgTestView extends SurfaceView implements SurfaceHolder.Callback {
Bitmap backBmp = null;
private int mMaximumDepth = -10;// 30;
private int mCanvasWidth;
private int mCanvasHeight;
public R3DImgTestView(Context context) {
super(context);
mReal3D = new Real3D(getHolder());
mReal3D.setReal3DInfo(new Real3DInfo(true, Real3D.REAL3D_TYPE_SS,
Real3D.REAL3D_ORDER_LR));
getHolder().addCallback(this);
}
public void draw() {
Canvas c;
c = getHolder().lockCanvas(null);
if (mBackBm != null) {
c.drawBitmap(mBackBm, null, new Rect(mMaximumDepth, 0,
mMaximumDepth + mCanvasWidth / 2, mCanvasHeight), null);
c.drawBitmap(mBackBm, null, new Rect(mCanvasWidth / 2 + 1
- mMaximumDepth, 0, mCanvasWidth - mMaximumDepth,
mCanvasHeight), null);
}
// drawIcons(c, mCanvasWidth, mCanvasHeight);
int i = 0;
for (i = 0; i < 40; i++) {
mZArray.get(i).drawOnCanvas(c, mCanvasWidth, mCanvasHeight);
}
measureFPS();
getHolder().unlockCanvasAndPost(c);
}
...
}
}
// @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
public void surfaceCreated(SurfaceHolder holder) {
mCanvasWidth = getWidth();
mCanvasHeight = getHeight();
draw();
}
// @Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
}
public void draw() {
Canvas c;
c = getHolder().lockCanvas(null);
에서, 디버깅해보니까 c가 null값을 가집니다.
logcat은 3d lib을 사용해서그런지, 평소에 보던거랑은 달리
03-20 23:30:11.578: E/Real3D(19035): setS3DType type = 129
이런식으로만 뜹니다ㅠ.ㅠ 도와주세요