2014-01-25 2 views
0

У меня есть следующий XML:приложение FC, если пользователь нажимает слишком много влево или вправо

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

Мой частичный код Java:

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; 
    } 
}; 

Вопрос гряду поперечнике.

  1. Нажав на макет, чтобы получить координату на определенной части (если я нажимаю/перетаскиваю весь путь влево или вправо), мое приложение FC. Я добавляю ниже LogCat:

01-25 01: 13: 21.059: E/AndroidRuntime (13345): неустранимым: главный 01-25 01: 13: 21,059: Е/AndroidRuntime (13345): java.lang.IllegalArgumentException: x должно быть < 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: Е/AndroidRuntime (13345): в android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:2174) 01-25 01: 13: 21,059: Е/AndroidRuntime (13345): в 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:187 5) 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/AndroidRun время (13345): at android.view.InputEventReceiver.dispatchInputEvent (InputEventReceiver.java:179) 01-25 01: 13: 21.059: E/AndroidRuntime (13345): at android.os.MessageQueue.nativePollOnce (собственный метод) 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 (родной метод) 01-25 01: 13: 21.059: E/A ndroidRuntime (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): в dalvik.system.NativeStart.main (Native Method)

Я хочу, чтобы позволить пользователю, чтобы иметь возможность перетащить весь путь левый, верхний, правый и нижний. Как мне изменить приведенный выше код для достижения этого? Благодаря!!!

ответ

1
  1. Переместите ваши записи x и y до того, как вы получите доступ к растровому изображению, чтобы увидеть, какие значения возвращаются.

  2. В стеке, не вызывайте getPixel со значениями x и y, которые превышают размеры вашего растрового изображения.

Смежные вопросы