안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요?
그냥 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)
로그캣 에러입니다.
봐주셔서 감사합니다 즐거운하루되세요 ㅎㅎ
2012.09.25 14:54:43
bit 변수 초기화를 해주셨나요?
그리고 Logcat의 로그정보에서 보여지는 라인 정보 보는 법을 익히셔야 할 것 같습니다.
com.example.ph.imageviewer.rColorAvg(imageviewer.java:
102
)
위 라인이 로그캣 정보 중 NullPoint Exception 위치를 나타냅니다 ( 바로 아래에 걸려있죠?)
따라서, 해석하자면 imageviewer 클래스 rColorAvg 메소드 내에서 Exception이 났음을 의미하고,
무엇보다도 그 위치가 imageviewer.java 의 102번 째 라인이라고 설명까지 나왔습니다.
걸어주신 소스는 일부문 올리신거 같은데요 그래서 라인이 매칭이 안되서 바로 확인이 안되었던 것 같구요..
비트맵이 null인거 같네요.