2012-12-16 30 views
1

我想在android上編寫簡單的圖像編輯器。但有一個問題。當我在模擬器上運行它時,所有的都是正確的,直到按下按鈕。 「不幸的是,......停止..」出現在屏幕上,程序被迫關閉。但我真的知道錯在哪裏。請幫我弄明白。非常感謝你。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

請給stacktrace !!! –

+1

分享關於錯誤 – 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(drawAction.effect_gray,canvas); 
+0

感謝關於LogCat信息。但是,我如何在onCreate {}中聲明變量'canvas'? –

+0

原始問題已解決,但是當我單擊按鈕時,圖像沒有任何事情發生。 –

+0

'公共類Aa擴展活動{0} {0} {0}私人按鈕btn1,btn2; \t private ImageView img1; \t私人畫布畫布; \t public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_aa);' –

1

通行證在畫布實例中draw方法作爲參數

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

使用類成員來保存畫布實例,然後根據需要調用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) { 
     ... 
}