应用程序是FC如果用户presses太多向左或向右太多、应用程序、用户、FC

2023-09-13 02:16:38 作者:一颗大白菜

我有以下的XML:

 <的LinearLayout
    机器人:ID =@ + ID / llColorSpect
    机器人:layout_width =match_parent
    机器人:layout_height =@扪/ color_scheme_height
    机器人:方向=垂直
    机器人:背景=@可绘制/ colorspect
    机器人:layout_marginRight =@扪/ activity_horizo​​ntal_margin
    机器人:layout_marginLeft =@扪/ activity_horizo​​ntal_margin
    机器人:layout_marginBottom =@扪/ seek_bar_margin
    机器人:layout_below =@ + ID / tvBGColor>
    < RelativeLayout的
        机器人:ID =@ + ID / rlColorSpect
        机器人:layout_width =match_parent
        机器人:layout_height =match_parent>
        < ImageView的
            机器人:ID =@ + ID / ivSquare
            机器人:layout_width =@扪/ title_text_pad
            机器人:layout_height =@扪/ title_text_pad
            机器人:layout_alignParentBottom =真
            机器人:scaleType =fitXY
            机器人:SRC =@可绘制/ esquare/>
    < / RelativeLayout的>
< / LinearLayout中>
 

我部分的Java code:

  View.OnTouchListener llTouch =新View.OnTouchListener(){

    @覆盖
    公共布尔onTouch(视图V,MotionEvent事件){
        INT X =(int)的event.getX();
        INT Y =(INT)event.getY();
        INT行动= event.getAction();
        INT像素= bitmap.getPixel((INT)X,(INT)Y);

        开关(行动及放大器; MotionEvent.ACTION_MASK){
            案例MotionEvent.ACTION_DOWN:{
                Log.i(坐标,触摸坐标:X+将String.valueOf(X)+Y+将String.valueOf(Y));
                ivTouch.setX(X);
                ivTouch.setY(Y);
                INT redValue = Color.red(象素);
                INT blueValue = Color.blue(象素);
                INT greenValue = Color.green(象素);
                Log.d(颜色,R+ redValue +G:+ greenValue +B:+ blueValue);
                sbRed.setProgress(redValue);
                sbGreen.setProgress(greenValue);
                sbBlue.setProgress(blueValue);
                dispHVal();
            打破;
            }
            案例MotionEvent.ACTION_MOVE:{
                Log.i(坐标,触摸坐标:X+将String.valueOf(X)+Y+将String.valueOf(Y));
                ivTouch.setX(X);
                ivTouch.setY(Y);
                INT redValue = Color.red(象素);
                INT blueValue = Color.blue(象素);
                INT greenValue = Color.green(象素);
                Log.d(颜色,R+ redValue +G:+ greenValue +B:+ blueValue);
                sbRed.setProgress(redValue);
                sbGreen.setProgress(greenValue);
                sbBlue.setProgress(blueValue);
                dispHVal();
            打破;
            }
        }
        返回true;
    }
};
 

这个问题我来跨越。

而在布局pressing来获得它的某些部分的坐标(如果我preSS /拖动一路向左或向右),我的应用程序FC。我加入下面的LogCat中:   

一月一号至25日:13:21.059:E / AndroidRuntime(13345):致命异常:主要   1月一日至25日:13:21.059:E / AndroidRuntime(13345):   java.lang.IllegalArgumentException:如果x必须是< bitmap.width()01-25   01:13:21.059:E / AndroidRuntime(13345):在   android.graphics.Bitmap.checkPixelAccess(Bitmap.java:1155)01-25   01:13:21.059:E / AndroidRuntime(13345):在   android.graphics.Bitmap.getPixel(Bitmap.java:1107)1月1日至25号:13:21.059:   E / AndroidRuntime(13345):在   com.test.testing.MainActivity $ 1.onTouch(MainActivity.java:98)01-25   01:13:21.059:E / AndroidRuntime(13345):在   android.view.View.dispatchTouchEvent(View.java:7241)01-25   01:13:21.059:E / AndroidRuntime(13345):在   android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2168)   1月一日至25日:13:21.059:E / AndroidRuntime(13345):在   android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1903)01-25   01:13:21.059:E / AndroidRuntime(13345):在   android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)   1月一日至25日:13:21.059:E / AndroidRuntime(13345):在   android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1875)01-25   01:13:21.059:E / AndroidRuntime(13345):在   android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)   1月一日至25日:13:21.059:E / AndroidRuntime(13345):在   android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1875)01-25   01:13:21.059:E / AndroidRuntime(13345):在   android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)   1月一日至25日:13:21.059:E / AndroidRuntime(13345):在   android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1875)01-25   01:13:21.059:E / AndroidRuntime(13345):在   android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)   1月一日至25日:13:21.059:E / AndroidRuntime(13345):在   android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1875)01-25   01:13:21.059:E / AndroidRuntime(13345):在   com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1953)   1月一日至25日:13:21.059:E / AndroidRuntime(13345):在   com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405)   1月一日至25日:13:21.059:E / AndroidRuntime(13345):在   android.app.Activity.dispatchTouchEvent(Activity.java:2410)01-25   01:13:21.059:E / AndroidRuntime(13345):在   com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchTouchEvent(PhoneWindow.java:1901)   1月一日至25日:13:21.059:E / AndroidRuntime(13345):在   android.view.View.dispatchPointerEvent(View.java:7426)01-25   01:13:21.059:E / AndroidRuntime(13345):在   android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3220)   1月一日至25日:13:21.059:E / AndroidRuntime(13345):在   android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3165)   1月一日至25日:13:21.059:E / AndroidRuntime(13345):在   android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4292)   1月一日至25日:13:21.059:E / AndroidRuntime(13345):在   android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4271)   1月一日至25日:13:21.059:E / AndroidRuntime(13345):在   android.view.ViewRootImpl $ WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4363)   1月一日至25日:13:21.059:E / AndroidRuntime(13345):在   android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179)   1月一日至25日:13:21.059:E / AndroidRuntime(13345):在   android.os.MessageQueue.nativePollOnce(本机方法)01-25   01:13:21.059:E / AndroidRuntime(13345):在   android.os.MessageQueue.next(MessageQueue.java:125)01-25   01:13:21.059:E / AndroidRuntime(13345):在   android.os.Looper.loop(Looper.java:124)1月1号至25号:13:21.059:   E / AndroidRuntime(13345):在   android.app.ActivityThread.main(ActivityThread.java:5195)01-25   01:13:21.059:E / AndroidRuntime(13345):在   java.lang.reflect.Method.invokeNative(本机方法)01-25   01:13:21.059:E / AndroidRuntime(13345):在   java.lang.reflect.Method.invoke(Method.java:511)1月1日至25日:13:21.059:   E / AndroidRuntime(13345):在   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:795)   1月一日至25日:13:21.059:E / AndroidRuntime(13345):在   com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)01-25   01:13:21.059:E / AndroidRuntime(13345):在   dalvik.system.NativeStart.main(本机方法)

欲允许用户能够一路向左拖动,上,右,和底部。如何修改上面的code来实现这一目标?谢谢!

解决方案

移动你的X和Y记录你访问的位图,看看有什么正在返回的值了。

每堆栈跟踪,不叫getPixel与值x和y超出您的位图的尺寸。

大数据相关知识

I have the following XML:

<LinearLayout
    android:id="@+id/llColorSpect"
    android:layout_width="match_parent"
    android:layout_height="@dimen/color_scheme_height"
    android:orientation="vertical"
    android:background="@drawable/colorspect"
    android:layout_marginRight="@dimen/activity_horizontal_margin"
    android:layout_marginLeft="@dimen/activity_horizontal_margin"
    android:layout_marginBottom="@dimen/seek_bar_margin"
    android:layout_below="@+id/tvBGColor" >
    <RelativeLayout
        android:id="@+id/rlColorSpect"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <ImageView
            android:id="@+id/ivSquare"
            android:layout_width="@dimen/title_text_pad"
            android:layout_height="@dimen/title_text_pad"
            android:layout_alignParentBottom="true"
            android:scaleType="fitXY"
            android:src="@drawable/esquare" />
    </RelativeLayout>
</LinearLayout>

My partial Java code:

View.OnTouchListener llTouch = new View.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int x = (int)event.getX();
        int y = (int)event.getY();
        int action = event.getAction();
        int pixel = bitmap.getPixel((int)x,(int) y);

        switch (action & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN: {
                Log.i("COORDINATES","Touch coordinates : x" + String.valueOf(x) + "y" + String.valueOf(y));
                ivTouch.setX(x);
                ivTouch.setY(y);
                int redValue = Color.red(pixel);
                int blueValue = Color.blue(pixel);
                int greenValue = Color.green(pixel);
                Log.d("Colors","R:" +redValue +" G:" +greenValue+" B:" + blueValue);
                sbRed.setProgress(redValue);
                sbGreen.setProgress(greenValue);
                sbBlue.setProgress(blueValue);
                dispHVal();
            break;
            }
            case MotionEvent.ACTION_MOVE:{
                Log.i("COORDINATES","Touch coordinates : x" + String.valueOf(x) + "y" + String.valueOf(y));
                ivTouch.setX(x);
                ivTouch.setY(y);
                int redValue = Color.red(pixel);
                int blueValue = Color.blue(pixel);
                int greenValue = Color.green(pixel);
                Log.d("Colors","R:" +redValue +" G:" +greenValue+" B:" + blueValue);
                sbRed.setProgress(redValue);
                sbGreen.setProgress(greenValue);
                sbBlue.setProgress(blueValue);
                dispHVal();
            break;
            }
        }
        return true;
    }
};

The issue I am coming across.

While pressing on the layout to get the coordinate on certain part of it (If I press/drag all the way to the left or to the right), my app FC. I am adding the LogCat below:

01-25 01:13:21.059: E/AndroidRuntime(13345): FATAL EXCEPTION: main 01-25 01:13:21.059: E/AndroidRuntime(13345): java.lang.IllegalArgumentException: x must be < bitmap.width() 01-25 01:13:21.059: E/AndroidRuntime(13345): at android.graphics.Bitmap.checkPixelAccess(Bitmap.java:1155) 01-25 01:13:21.059: E/AndroidRuntime(13345): at android.graphics.Bitmap.getPixel(Bitmap.java:1107) 01-25 01:13:21.059: E/AndroidRuntime(13345): at com.test.testing.MainActivity$1.onTouch(MainActivity.java:98) 01-25 01:13:21.059: E/AndroidRuntime(13345): at android.view.View.dispatchTouchEvent(View.java:7241) 01-25 01:13:21.059: E/AndroidRuntime(13345): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2168) 01-25 01:13:21.059: E/AndroidRuntime(13345): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1903) 01-25 01:13:21.059: E/AndroidRuntime(13345): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 01-25 01:13:21.059: E/AndroidRuntime(13345): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1875) 01-25 01:13:21.059: E/AndroidRuntime(13345): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 01-25 01:13:21.059: E/AndroidRuntime(13345): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1875) 01-25 01:13:21.059: E/AndroidRuntime(13345): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 01-25 01:13:21.059: E/AndroidRuntime(13345): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1875) 01-25 01:13:21.059: E/AndroidRuntime(13345): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 01-25 01:13:21.059: E/AndroidRuntime(13345): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1875) 01-25 01:13:21.059: E/AndroidRuntime(13345): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1953) 01-25 01:13:21.059: E/AndroidRuntime(13345): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405) 01-25 01:13:21.059: E/AndroidRuntime(13345): at android.app.Activity.dispatchTouchEvent(Activity.java:2410) 01-25 01:13:21.059: E/AndroidRuntime(13345): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1901) 01-25 01:13:21.059: E/AndroidRuntime(13345): at android.view.View.dispatchPointerEvent(View.java:7426) 01-25 01:13:21.059: E/AndroidRuntime(13345): at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3220) 01-25 01:13:21.059: E/AndroidRuntime(13345): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3165) 01-25 01:13:21.059: E/AndroidRuntime(13345): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4292) 01-25 01:13:21.059: E/AndroidRuntime(13345): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4271) 01-25 01:13:21.059: E/AndroidRuntime(13345): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4363) 01-25 01:13:21.059: E/AndroidRuntime(13345): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179) 01-25 01:13:21.059: E/AndroidRuntime(13345): at android.os.MessageQueue.nativePollOnce(Native Method) 01-25 01:13:21.059: E/AndroidRuntime(13345): at android.os.MessageQueue.next(MessageQueue.java:125) 01-25 01:13:21.059: E/AndroidRuntime(13345): at android.os.Looper.loop(Looper.java:124) 01-25 01:13:21.059: E/AndroidRuntime(13345): at android.app.ActivityThread.main(ActivityThread.java:5195) 01-25 01:13:21.059: E/AndroidRuntime(13345): at java.lang.reflect.Method.invokeNative(Native Method) 01-25 01:13:21.059: E/AndroidRuntime(13345): at java.lang.reflect.Method.invoke(Method.java:511) 01-25 01:13:21.059: E/AndroidRuntime(13345): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 01-25 01:13:21.059: E/AndroidRuntime(13345): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 01-25 01:13:21.059: E/AndroidRuntime(13345): at dalvik.system.NativeStart.main(Native Method)

I want to allow the user to be able to drag all the way to the left, top, right, and bottom. How do I modify the above code to achieve that? Thanks!!!

解决方案

Move your x and y logging to before you access the bitmap to see what values are being returned.

Per the stacktrace, don't call getPixel with values x and y which exceed the dimensions of your bitmap.