2

Ich habe VectorDrawableCompat als Hintergrund meiner Ansicht festgelegt.Wie Pixelfarbe von VectorDrawableCompat durch angegebene X- und Y-Koordinaten erhalten

Ich brauche einen Klick auf dieser Ansicht zu behandeln nur, wenn ich auf einem nicht transparenten Bereich ziehbar geklickt.

Für BitmapDrawable ist ziemlich einfach - ich könnte einfach getPixel (x, y) überprüfen, was ich dagegen mit VectorDrawableCompat tun könnte?

+1

ziehen Sie Ihre 'Drawable' auf dem temporären' Bitmap' dann – pskink

+0

@pskink es funktioniert, aber es ist zu viel Overhead, btw VectorDrawableCompat enthält bereits zwischengespeicherte Bitmap – Stepango

+0

dies ist die einzige Möglichkeit, und nein, verwenden Sie keine Reflexion, um den Cache zu erhalten, wie es in jeder Zukunft geändert werden kann – pskink

Antwort

2

können Sie versuchen, Reflexion zu verwenden, um Zugang Feld VectorDrawableCompat.mVectorState und erhalten im Cache gespeicherten Bitmap von Immobilien mCachedBitmap

So etwas:

 public static int getColorAt(VectorDrawableCompat drawable, float x, float y) { 
     try { 
      final Field field = drawable.getClass().getDeclaredField("mVectorState"); 
      field.setAccessible(true); 
      final Object state = field.get(drawable); 
      final Field bitmapField = state.getClass().getDeclaredField("mCachedBitmap"); 
      bitmapField.setAccessible(true); 
      final Bitmap bitmap = (Bitmap) bitmapField.get(state); 
      return bitmap.getPixel((int) x, (int) y); 
     } catch (NoSuchFieldException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
     return -1; 
    } 
+1

Ich habe keine Ahnung, warum "Reflexion" basierte Lösungen sind immer so geschätzt, Sie sollte das nie tun, wenn du in der Zukunft Probleme haben willst – pskink

+0

Du hast recht, aber wenn du keine anderen Möglichkeiten hast ist es immer noch schlecht, aber funktionierende Lösung, aber ja, du kannst in Zukunft Probleme bekommen, aber Support Library ist nur Abhängigkeit, nicht ein Teil des Frameworks, so dass Sie Updates steuern können und sich keine Sorgen über eventuelle Änderungen der Klassenrealisierung machen. – gildor

+0

Sie haben andere Möglichkeiten, rufen Sie 'Drawable # draw', BTW wissen Sie tha t support-Bibliothek verwendet ** nicht ** mCachedBitmap, wenn es auf den Plattformen mit "VectorDrawable" (API 5+) ausgeführt wird und nur die native Implementierung verwendet? Natürlich können Sie das deaktivieren, aber dann können Sie auch einfach die Methode 'getCachedBitmap' /' getPixel'/was auch immer hinzufügen - so dass die Reflektion in diesem Fall nicht benötigt wird – pskink

Verwandte Themen