Getting an IllegalArgumentException when trying to make the transparent area of ​​an image button inappropriate

I get an illegal exception trying to make the transparent area of ​​the image button invisible. How to solve this problem: I implemented OnTouchListner and implemented loadBitmapFromView(View v)

code:

  package com.sunojsworkshop; import android.os.Bundle; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageButton; import android.widget.Toast; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageButton imgView= (ImageButton) findViewById(R.id.imageButton1); imgView.setDrawingCacheEnabled(true); imgView.setOnTouchListener(new OnTouchListener(){ //private final OnTouchListener changeColorListener = new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { Bitmap bmp = loadBitmapFromView(v); int color = bmp.getPixel((int) event.getX(),(int) event.getY()); if (color == Color.TRANSPARENT) return false; else { //code to execute Toast.makeText(MainActivity.this, "Image button is being clicked", Toast.LENGTH_SHORT).show(); return true; } } public Bitmap loadBitmapFromView(View v) { // TODO Auto-generated method stub Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(b); v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height); v.draw(c); return b; } }); } } 

XML:

  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:background="@drawable/worldfinal" tools:context=".MainActivity" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="SELECT A DESIRED COUNTRY" /> <ImageButton android:id="@+id/imageButton1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_below="@+id/textView1" android:layout_marginRight="28dp" android:layout_marginTop="93dp" android:src="@drawable/india1" android:background="@android:color/transparent" /> 

and Log:

  08-06 13:13:24.162: E/AndroidRuntime(329): FATAL EXCEPTION: main 08-06 13:13:24.162: E/AndroidRuntime(329): java.lang.IllegalArgumentException: width and height must be > 0 08-06 13:13:24.162: E/AndroidRuntime(329): at android.graphics.Bitmap.nativeCreate(Native Method) 08-06 13:13:24.162: E/AndroidRuntime(329): at android.graphics.Bitmap.createBitmap(Bitmap.java:477) 08-06 13:13:24.162: E/AndroidRuntime(329): at com.sunojsworkshop.MainActivity$1.loadBitmapFromView(MainActivity.java:49) 08-06 13:13:24.162: E/AndroidRuntime(329): at com.sunojsworkshop.MainActivity$1.onTouch(MainActivity.java:35) 08-06 13:13:24.162: E/AndroidRuntime(329): at android.view.View.dispatchTouchEvent(View.java:3881) 08-06 13:13:24.162: E/AndroidRuntime(329): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:869) 08-06 13:13:24.162: E/AndroidRuntime(329): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:869) 08-06 13:13:24.162: E/AndroidRuntime(329): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:869) 08-06 13:13:24.162: E/AndroidRuntime(329): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:869) 08-06 13:13:24.162: E/AndroidRuntime(329): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1691) 08-06 13:13:24.162: E/AndroidRuntime(329): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1125) 08-06 13:13:24.162: E/AndroidRuntime(329): at android.app.Activity.dispatchTouchEvent(Activity.java:2096) 08-06 13:13:24.162: E/AndroidRuntime(329): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1675) 08-06 13:13:24.162: E/AndroidRuntime(329): at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2194) 08-06 13:13:24.162: E/AndroidRuntime(329): at android.view.ViewRoot.handleMessage(ViewRoot.java:1878) 08-06 13:13:24.162: E/AndroidRuntime(329): at android.os.Handler.dispatchMessage(Handler.java:99) 08-06 13:13:24.162: E/AndroidRuntime(329): at android.os.Looper.loop(Looper.java:123) 08-06 13:13:24.162: E/AndroidRuntime(329): at android.app.ActivityThread.main(ActivityThread.java:3683) 08-06 13:13:24.162: E/AndroidRuntime(329): at java.lang.reflect.Method.invokeNative(Native Method) 08-06 13:13:24.162: E/AndroidRuntime(329): at java.lang.reflect.Method.invoke(Method.java:507) 08-06 13:13:24.162: E/AndroidRuntime(329): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 08-06 13:13:24.162: E/AndroidRuntime(329): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 08-06 13:13:24.162: E/AndroidRuntime(329): at dalvik.system.NativeStart.main(Native Method) </RelativeLayout> 
-1
source share
2 answers
 v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height); 

you get the value "0" here, but the layout should have at least the value "1". Have you tried to put different meanings here?

+1
source

when you call loadBitmapFromView in onCreate , the layouts have not yet been measured and bloated. You must call it after the user interface has measured all views and their sizes are greater than 0 x 0.

take a look at onSizeChanged and think about overriding this for your view.

0
source

All Articles