私はたくさんグーグルで検索しましたが、役に立つものは何も見つかりませんでした。複雑な png 画像があり、それをタッチ可能にしたいのですが、不透明な領域のみです。タッチリスナーを設定しましたが、透明な領域をクリックしてもディスパッチされました。それは私が望んでいないことです。
3 に答える
@Cata が言うように、タッチ イベントは画像全体に関連付けられます。ただし、タッチ イベントは画像内のどこにタッチがあったかを教えてくれるので、次のようにコーディングできます (正しいアクションのチェックなどを無視します)。
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean eventHandled = false;
int x = (int) (event.getX());
int y = (int) (event.getY());
if (imageIsOpaque(x,y) {
//Do the stuff
eventHandled = true;
}
return eventHandled;
}
ここで重要なのは imageIsOpaque で、次の 3 つの方法のいずれかで実装する必要があります。
画像は、不透明な領域と不透明でない領域に簡単に分割できます。その場合、次のようになります。
boolean imageIsOpaque(int touchX, int touchY) { ArayList<Rect> rectsOfOpaqueness; // You will need to define these ... boolean isOpaque = false; for (int i=0; i<rectsOfOpaqueness.size() && !isOpaque; i++) { if (rectsOfOpaqueness.get(i).contains(touchX, touchY)) { isOpaque = true; } return isOpaque; }
画像をそのように扱うのは簡単ではないかもしれません。その場合、x と y のタッチ位置を使用して、ポイントが不透明かどうかをソース画像 (画面上のサイズにスケーリング) でチェックする必要があります。編集:以下の@vinodへのコメントで、このソリューションをかなりきちんとした方法で使用しているようですので、他の読者にもそのコメントをチェックすることをお勧めします.
さらに複雑なのは、その場で作成している画像であり、検索可能な方法で最終状態であることを実際に認識していない可能性があります。この場合、イメージを作成する際に、不透明な点とそうでない点を判断するために、ブーリアンの 2D 配列を個別に作成する必要があります。
@ user1716538: PNG 画像を使用しないのはなぜですか? Uはpng画像を使用して画像の不要な部分を削除できるため、画像のそれらの部分ではクリックイベントは発生しません。
タッチ リスナーは、ビューの一部ではなく、ビュー全体に適用されます。そのため、画像を小さな断片に分割し、不透明な部分ごとにタッチ リスナーを追加することをお勧めします。あなたが達成したいことをよりよく理解できるように、ここに画像を投稿することもできます..