線を描画するために 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);