2012-12-16 4 views
1

안드로이드에 쉬운 이미지 편집기를 작성하고 싶습니다. 그러나 문제가 있습니다. 버튼을 누를 때까지 에뮬레이터에서 실행할 때 모두 정확합니다. "불행히도, ..... stop .."이 화면에 나타나 프로그램을 강제 종료했습니다. 그러나 나는 어디에서 잘못되었는지 정말로 알고 있습니다. 그것을 이해하도록 도와주세요. 고맙습니다.Android : onClick 불행히도 중지되었습니다

여기 내 프로그램 코드입니다.

btn1.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View arg0) { 
      draw(drawAction.effect_gray); 
      } 
     }); 

    btn2.setOnClickListener(new OnClickListener() { 
     public void onClick(View arg0) { 
      draw(drawAction.effect_negative); 
      } 
     }); 
    } 

@Override 
protected void onResume() { 
    super.onResume(); 

} 

enum drawAction { 
    effect_gray, effect_negative; 
} 

void draw(drawAction action) { 
    Canvas canvas = null; 

    switch (action) { 
    case effect_gray: 
     gray(canvas); 
     break; 
    case effect_negative: 
     negative(canvas); 
     break; 
} 
     } 
void gray(Canvas canvas) { 
    Bitmap vBitmap2 = BitmapFactory.decodeResource(this.getResources() 
      , R.drawable.images); 

    Paint paint = new Paint(); 
    ColorMatrix colorMatrix = new ColorMatrix(); 
    colorMatrix.setSaturation(0); 
    ColorMatrixColorFilter colorMatrixFilter = new ColorMatrixColorFilter(colorMatrix); 
    paint.setColorFilter(colorMatrixFilter); 
    canvas.drawBitmap(vBitmap2, 0, 0, paint); 

img1.setImageBitmap(vBitmap2); 
} 

    void negative(Canvas canvas) { 
    Bitmap vBitmap2 = BitmapFactory.decodeResource(this.getResources() 
       , R.drawable.images); 
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);  
    ColorMatrix cm = new ColorMatrix(new float[] { 
    -1f, 0f, 0f, 0f, 255f, 
    0f, -1f, 0f, 0f, 255f, 
    0f, 0f, -1f, 0f, 255f, 
    0f, 0f, 0f, 1f, 0f}); 
    paint.setColorFilter(new ColorMatrixColorFilter(cm)); 
    canvas.drawBitmap(vBitmap2, 0, 0, paint); 

    img1.setImageBitmap(vBitmap2); 
} 
} 



12-16 16:32:11.741: E/AndroidRuntime(597): FATAL EXCEPTION: main 
12-16 16:32:11.741: E/AndroidRuntime(597): java.lang.NullPointerException 
12-16 16:32:11.741: E/AndroidRuntime(597): at com.example.a.Aa.gray(Aa.java:81) 
12-16 16:32:11.741: E/AndroidRuntime(597): at com.example.a.Aa.draw(Aa.java:64) 
12-16 16:32:11.741: E/AndroidRuntime(597): at com.example.a.Aa$1.onClick(Aa.java:37) 
12-16 16:32:11.741: E/AndroidRuntime(597): at android.view.View.performClick(View.java:3480) 
12-16 16:32:11.741: E/AndroidRuntime(597): at android.view.View$PerformClick.run(View.java:13983) 
12-16 16:32:11.741: E/AndroidRuntime(597): at android.os.Handler.handleCallback(Handler.java:605) 
12-16 16:32:11.741: E/AndroidRuntime(597): at android.os.Handler.dispatchMessage(Handler.java:92) 
12-16 16:32:11.741: E/AndroidRuntime(597): at android.os.Looper.loop(Looper.java:137) 
12-16 16:32:11.741: E/AndroidRuntime(597): at android.app.ActivityThread.main(ActivityThread.java:4340) 
12-16 16:32:11.741: E/AndroidRuntime(597): at java.lang.reflect.Method.invokeNative(Native Method) 
12-16 16:32:11.741: E/AndroidRuntime(597): at java.lang.reflect.Method.invoke(Method.java:511) 
12-16 16:32:11.741: E/AndroidRuntime(597): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
12-16 16:32:11.741: E/AndroidRuntime(597): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
12-16 16:32:11.741: E/AndroidRuntime(597): at dalvik.system.NativeStart.main(Native Method) 
+1

스택 트레이스를주세요! –

+1

공유 LogCat 오류에 관한 에러 – Adil

답변

3

여기

Canvas canvas = null; 
switch (action) { 
case effect_gray: 
    gray(canvas); 
    break; 
case effect_negative: 
    negative(canvas); 
    break; 
} 

처음에 캔버스 문제가 널 생각하면 널 포인터 예외를 제공 널의 힘으로 캔버스를 전달하고 있습니다. 더 스택 추적을 공유하시기 바랍니다 .. 같은이 방법

void draw(drawAction action, Canvas canvas) 
{ 
    if(canvas != null) 
    { 
     switch (action) { 
      case effect_gray: 
      gray(canvas); 
      break; 
     case effect_negative: 
      negative(canvas); 
      break; 
    } 
} 

등의 재 작성 및 전화 : 매개 변수로 draw 방법에 캔버스 인스턴스

draw(drawAction.effect_gray,canvas); 
+0

감사합니다. 하지만 onCreate {}에 변수 'canvas'를 선언하려면 어떻게해야합니까? –

+0

원래의 문제는 해결되었지만 버튼을 클릭해도 이미지에는 아무런 변화가 없습니다 .. –

+0

'public class Aa extends Activity { \t 비공개 버튼 btn1, btn2; \t 개인 ImageView img1; \t 개인 캔버스 캔버스; \t public void onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.activity_aa); ' –

1

패스를

void draw(drawAction action, Canvas canvas) { 

    if(canvas != null) 
    { 
     switch (action) { 
      case effect_gray: 
       gray(canvas); 
       break; 
      case effect_negative: 
       negative(canvas); 
       break; 
     } 
    } 
} 
0

enum은 필요하지 않습니다.

클래스 멤버를 사용하여 Canvas 인스턴스를 보유한 다음 필요에 따라 graynegative 메서드를 호출하십시오.

private Canvas mCanvas; 

onCreate(Bundle bundle) 
{ 
    btn1.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View arg0) { 
      gray(mCanvas); 
     } 
    }); 

    btn2.setOnClickListener(new OnClickListener() { 
     public void onClick(View arg0) { 
      negative(mCanvas); 
     } 
    }); 
} 

... 

void gray(Canvas canvas) { 
    ... 
} 

void negative(Canvas canvas) { 
     ... 
} 
관련 문제