1

ユーザーが指で描画できるカスタム ビューを実装しようとしています。基本的に、私はこのチュートリアルに従っています。

すべてがうまく機能しているように見えますが、次のようにカスタム ビューの下に 2 つのボタンもあるという事実を考えると、

<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:background="@color/background_color"
    tools:context=".MainActivity" 
    android:id="@+id/mainScreen" >

    <Button
        android:id="@+id/buttonSave"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentBottom="true"
        android:text="@string/save" />

    <Button
        android:id="@+id/buttonQuery"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        android:text="@string/query" />

    <com.example.myapp.DrawView
        android:id="@+id/drawView"
        android:background="@color/red"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_above="@id/buttonSave" />

</RelativeLayout>

実際にはボタンの下でも描画され、DrawView で発生したタッチイベントのみをキャプチャし、その外側ではキャプチャしない理由を理解するのに苦労しています。基本的に、ボタンの上から線を引くことはできませんが、ビューに描画を開始すると、線を外側に延長することもできます。

私が知る限り、ここで説明したように、DrawView はボタンの下にオーバーフローしていないので、何が起こっているのかを把握したいと思います。イベントが範囲外かどうかを本当に確認する必要がありますか? 現在フォーカスされているビューにすべてのタッチ イベントを実際に委譲しますか? この動作を変更する方法はありますか?

この簡単なチュートリアルには、説明されている問題はありませんが、ポイントごとに描画されます。


更新:アプリケーションをデバッグしたところ、drawView のサイズは 480x728 で、mainScreen のサイズは 480x800 であるため、重複していないことがわかりました。フォーカスがあると、drawView の外部でトリガーされた場合でも、タッチ イベントを登録し続けます。これは私が避けようとしているものであり、イベント座標を大きな if ステートメントに渡さずに行うとよいでしょう...

4

2 に答える 2

0

これは、Android エミュレーターがインターフェイスを表示する方法の奇妙なバグであることが判明しました。実際のデバイスでも同様のことを行う可能性があります (リスナー ビューの外でもタッチ イベントをスローします) が、表示が に制限されるためdrawView、描画された形状を から抽出する必要があるだけなので、アプリケーションではそれらを安全に無視できますdrawView。ただし、他のアプリケーションでは大きな頭痛の種になる可能性があります...

于 2012-08-07T16:28:31.887 に答える
0

ボタンをオーバーラップさせたくない場合はDrawView、 a を使用LinearLayoutしてすべてViewの を分離します。現時点では、XML レイアウトから判断すると (そして、コードでプログラムによってレイアウトに奇妙なことが起こっていないと仮定すると)、ボタンDrawView.

上部に 2 つのボタンを並べて配置し、DrawViewその下の残りの画面領域を埋めた後の印象を受けています。これを行うには、LinearLayout垂直方向の外側のコンテナーを使用します。その最初の子はLinearLayout、2 つのボタンを含む水平方向の別の子です。内部の 2 番目の子LinearLayoutDrawView. 幅、高さ、および重量の属性を使用して、目的の寸法を取得します。(または、別の方法として、既存の XML レイアウト構造を維持し、上余白をDrawViewボタンの高さと同じに設定することもできます。これは、XML レイアウトで修正するか、プログラムで行うことができます。)

EDIT申し訳ありませんが、layout_above2 番目の文を無効にする属性を完全に見逃してしまいました。その場合、現時点でEclipseを起動できなければ、わかりません。LinearLayoutとにかく提案されたアプローチを試してください。

于 2012-07-31T16:32:08.500 に答える