마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

real3D를 사용하고있는데, lockCavnas()가 null을 return해요

0 추천

 

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

이런식으로만 뜹니다ㅠ.ㅠ 도와주세요

흑건 (120 포인트) 님이 2013년 3월 20일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...