안녕하세요?

그냥 Activity 내의 onTouchEvent 에서는 되는 계산인데 View 클래스 안에 넣은 onTouchEvent내에서는 계산이 안되서 에러가 뜨네요.

 

a.jpg라는 사진파일을 불러와서 imageview.xml의 레이아웃 내의 imageView를 통해서 띄우고

View를 addContentView를 사용하여 터치다운 됐을때 원을 그립니다.

터치됐을때 좌표x,y와 원은 나타내지는데,

계산이 들어간 onTouchEvent내의 touch[0]=rColorAvg(touvhedX, touchedY,num); 를 넣으면

여기에서 오류가 생기는거 같은데 왜 그런지 모르겠습니다.

package com.example.ph;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.os.Bundle;
import android.os.Environment;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
public class imageviewer extends Activity {
 private Button returnButton;
 private DrawView mView;
 private TextView phtext;
 private TextView finalPH;
 int rAvg[] = new int[3];
 int rArr[][] = new int[3][11];// 기본 분석
 // ///////////////////////////////////////
 int touch[] = new int[3];
 int num = 30;// 샘플링횟수
 int touchedX = 0, touchedY = 0;
 Bitmap bit;
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.imageview);
  mView = new DrawView(this);
  addContentView(mView, new LinearLayout.LayoutParams(680, 480));
  String path = Environment.getExternalStorageDirectory()
    .getAbsolutePath() + "/DCIM/Camera/a.jpg";
  ImageView img_name_img_I = (ImageView) findViewById(R.id.imageid);
  Bitmap bm = BitmapFactory.decodeFile(path);
  img_name_img_I.setImageBitmap(bm);
  phtext = (TextView) findViewById(R.id.ph);
  returnButton = (Button) findViewById(R.id.retakebutton);
  returnButton.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    finish();
   }
  });
 }
 public class DrawView extends View {
  Paint circleP;
  public DrawView(Context context) {
   super(context);
   init();
  }
  private void init() {
   circleP = new Paint();
   circleP.setColor(Color.RED);
   circleP.setStyle(Style.FILL);
  }
  protected void onDraw(Canvas canvas) {
   canvas.drawCircle(touchedX, touchedY, 10, circleP);
  }
 @Override
  public boolean onTouchEvent(MotionEvent event) {
   if (event.getAction() == MotionEvent.ACTION_DOWN) {
    touchedX = (int) event.getX();
    touchedY = (int) event.getY();
     touch[0] = rColorAvg(touchedX, touchedY, num);
    // touch[1] = gColorAvg(touchedX, touchedY, num);
    // touch[2] = bColorAvg(touchedX, touchedY, num);
    phtext.setText( "touch[0]="+touch[0]+"x=" + touchedX + ",y="
     + touchedY);
   }
   invalidate();
   return true;
  }
 }
 public int rColorAvg(int x, int y, int j) {
  for (int k = -5; k < 5; k++) {
   for (int i = 0; i < j; i++) {
    rAvg[0] = ((bit.getPixel(x + i - j / 2, y + k) & 0x00FF0000) >> 16)
      + rAvg[0];
   }
  }
  return rAvg[0] / (j * 10);
 }
}

위에 코드이구요.

 09-25 14:32:02.052: E/AndroidRuntime(14201): FATAL EXCEPTION: main
09-25 14:32:02.052: E/AndroidRuntime(14201): java.lang.NullPointerException
09-25 14:32:02.052: E/AndroidRuntime(14201):  at com.example.ph.imageviewer.rColorAvg(imageviewer.java:102)
09-25 14:32:02.052: E/AndroidRuntime(14201):  at com.example.ph.imageviewer$DrawView.onTouchEvent(imageviewer.java:85)
09-25 14:32:02.052: E/AndroidRuntime(14201):  at android.view.View.dispatchTouchEvent(View.java:3938)
09-25 14:32:02.052: E/AndroidRuntime(14201):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:869)
09-25 14:32:02.052: E/AndroidRuntime(14201):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:869)
09-25 14:32:02.052: E/AndroidRuntime(14201):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1755)
09-25 14:32:02.052: E/AndroidRuntime(14201):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1173)
09-25 14:32:02.052: E/AndroidRuntime(14201):  at android.app.Activity.dispatchTouchEvent(Activity.java:2096)
09-25 14:32:02.052: E/AndroidRuntime(14201):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1739)
09-25 14:32:02.052: E/AndroidRuntime(14201):  at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2215)
09-25 14:32:02.052: E/AndroidRuntime(14201):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1886)
09-25 14:32:02.052: E/AndroidRuntime(14201):  at android.os.Handler.dispatchMessage(Handler.java:99)
09-25 14:32:02.052: E/AndroidRuntime(14201):  at android.os.Looper.loop(Looper.java:130)
09-25 14:32:02.052: E/AndroidRuntime(14201):  at android.app.ActivityThread.main(ActivityThread.java:3687)
09-25 14:32:02.052: E/AndroidRuntime(14201):  at java.lang.reflect.Method.invokeNative(Native Method)
09-25 14:32:02.052: E/AndroidRuntime(14201):  at java.lang.reflect.Method.invoke(Method.java:507)
09-25 14:32:02.052: E/AndroidRuntime(14201):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
09-25 14:32:02.052: E/AndroidRuntime(14201):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
09-25 14:32:02.052: E/AndroidRuntime(14201):  at dalvik.system.NativeStart.main(Native Method)


 로그캣 에러입니다.

봐주셔서 감사합니다 즐거운하루되세요 ㅎㅎ