-1

I'm getting illegal exception while trying to make transparent area of an image button unclickable. How to solve this issue: I have implemented OnTouchListner and implemented loadBitmapFromView(View v)

code is :

 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 is:

 <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 is:

 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>
user207421
  • 305,947
  • 44
  • 307
  • 483
  • 2
    Don't be sloppy when reading or reporting exceptions. It's not an 'illegal exception', it's an IllegalArgumentException. It makes all the difference in the world. – user207421 Aug 06 '13 at 08:07

2 Answers2

1
v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);

you are getting the value "0" here, but the layout needs at least a value of "1". Did you try supplying different values here?

user207421
  • 305,947
  • 44
  • 307
  • 483
bofredo
  • 2,348
  • 6
  • 32
  • 51
0

when you call loadBitmapFromView in onCreate the layouts haven't been measured and inflated yet. You need to call it after the UI has measured all the views and their sizes are greater than 0 x 0.

have a look at onSizeChanged and think about overriding that for your view.

ScouseChris
  • 4,377
  • 32
  • 38