1

線を描画するために ImageButton をサブクラス化し、実際のボタン座標がグリッドビュー内のどこにあるかを把握しようとしています。onGlobalLayout を使用して上、下、右、左を設定していますが、これらは実際のボタンではなく、グリッド内の実際の「正方形」用のようです (画像を参照)。紫色の線は、myImageButton.onGlobalLayout() から収集された座標を使用して、myImageButton.onDraw() で描画されます。これらはボタン用だと思っていましたが、別のもののようです。わからない。紫色の線をボタンの輪郭と一致させたいので、描いた線がボタンに表示され、LinearLayout のどこかに浮かんでいるだけではありません。水色は、Textview (数値用) と myImageButton を保持する垂直 LinearLayout の背景色です。実際のボタンのサイズを取得する方法はありますか?

グリッドビュー/レイアウト/ボタン

XML レイアウト:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/lay_cellframe"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="fill_vertical|fill_horizontal"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/tv_cell"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_margin="2dp"
            android:gravity="center"
            android:text="TextView"
            android:textSize="10sp" />

        <com.example.icaltest2.myImageButton
            android:id="@+id/imageButton1"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_gravity="center"
            android:layout_margin="0dp"
            android:adjustViewBounds="false"
            android:background="@android:drawable/btn_default"
            android:scaleType="fitXY"
            android:src="@android:color/transparent" />

    </LinearLayout>
</FrameLayout>

myImageButton.java

   public myImageButton (Context context, AttributeSet attrs)
   {
       super (context, attrs);
       mBounds = new Rect();
       ViewTreeObserver vto = this.getViewTreeObserver ();
       vto.addOnGlobalLayoutListener (ogl);
       Log.d (TAG, "myImageButton");
   }


...

    OnGlobalLayoutListener ogl = new OnGlobalLayoutListener()
        {


            @Override
            public void onGlobalLayout ()
            {
                Rect b = getDrawable ().getBounds ();


                mBtnTop = b.centerY () - (b.height () / 2);
                mBtnBot = b.centerY () + (b.height () / 2);
                mBtnLeft = b.centerX () - (b.width () / 2);
                mBtnRight = b.centerX () + (b.width () / 2);

            }
        };
...

 @Override
   protected void onDraw (Canvas canvas)
   {

      super.onDraw (canvas);
      Paint p = new Paint ();
        p.setStyle (Paint.Style.STROKE);
        p.setStrokeWidth (1);

        p.setColor (Color.MAGENTA);
        canvas.drawCircle (mBtnLeft, mBtnTop, 2, p);
        canvas.drawCircle (mBtnLeft, mBtnBot, 2, p);
        canvas.drawCircle (mBtnRight, mBtnTop, 2, p);
        canvas.drawCircle (mBtnRight, mBtnBot, 2, p);
            canvas.drawRect (mBtnLeft, mBtnTop, mBtnRight, mBtnBot, p);


}

更新: jsmithの提案で画像を追加

Rect r = canvas.getClipBounds (); //<- not sure about this
        int w = getMeasuredWidth () - getPaddingLeft () - getPaddingRight ();
        int h = getMeasuredHeight () - getPaddingTop () - getPaddingBottom ();

        int left = r.centerX () - (w / 2);
        int right = r.centerX() + ( w / 2);
        int top = r.centerY() - (h / 2);
        int bot = r.centerY() + (h / 2);


        p.setColor (Color.GREEN);
        canvas.drawRect (left, top, right, bot, p);

ここに画像の説明を入力

4

2 に答える 2

1

あなたがしていることは正しいと思います。問題は、Androidの標準のボタンスタイルに約3ディップのパディングがあるため、画像がグリッドビューのセルに整列しているように見えますが、そうではありません。

したがって、ボタンのビューに合わせるには、線の幅を6ディップ幅(左に3つ、右に3つ)にする必要があります。

mBtnLeft = b.centerX () - (b.width () / 2) + 3;
mBtnRight = b.centerX () + (b.width () / 2) - 3;
于 2012-12-18T17:16:56.147 に答える
1

onDraw が呼び出されるまでに、レイアウトが処理され、サイズ情報が利用可能になるはずです。を使用して、View.getMeasuredWidth() / View.getMeasuredHeight()必要な情報を取得できます。ただし、 でパディングを考慮する必要がある場合もありますView.getPaddingLeft() / ..。例えば:

final int displayWidth = (getMeasuredWidth() - getPaddingLeft() - getPaddingRight());
于 2012-12-18T17:29:53.350 に答える