1. ホーム
  2. アンドロイド

[解決済み】Android:LinearLayoutにボーダーを描画する方法

2022-04-29 11:37:07

質問

3つのファイルがあります。XML、draw関数、main Activityです。 いくつかの LinearLayout をXMLファイル内に記述しています。

<LinearLayout android:orientation="horizontal"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:layout_weight="1">
    <LinearLayout android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
                  android:layout_weight="1"
                  android:background="#ef3"
                  android:id="@+id/img01"/>
    <LinearLayout android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
                  android:layout_weight="1"
                  android:background="#E8A2B4"
                  android:id="@+id/img02"/>
</LinearLayout>

これが描画機能です。

public class getBorder extends TextView {
    public getBorder(Context context) {
        super(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint = new Paint();

        paint.setColor(android.graphics.Color.RED);

        canvas.drawLine(0, 0, this.getWidth() - 1, 0, paint);
        canvas.drawLine(0, 0, 0, this.getHeight() - 1, paint);
        canvas.drawLine(this.getWidth() - 1, 0, this.getWidth() - 1,
            this.getHeight() - 1, paint);
        canvas.drawLine(0, this.getHeight() - 1, this.getWidth() - 1,
            this.getHeight() - 1, paint);
    }
}

そして、これがメインのアクティビティです。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    final getBorder getBorder = new getBorder(this);
    final LinearLayout img01 = (LinearLayout) findViewById(R.id.img01);
    img01.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            getBorder.setWidth(100);
            getBorder.setHeight(100);
            img01.addView(getBorder);
        }
    });       
}

プログラムはボーダーを描くことができますが、そのサイズは LinearLayout . をクリックすると LinearLayout を再度実行すると、プログラムがクラッシュしました。

また、中央に2つの円を描きたいのですが、これは LinearLayout しかし、どのように中心座標を決定すればよいのでしょうか?

どのように解決するのですか?

本当にプログラムでやる必要があるのか?

タイトルを考えただけで ShapeDrawableをandroid:backgroundとして使えばいいのでは...。

たとえば、次のように定義します。 res/drawable/my_custom_background.xml としています。

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
  <corners
      android:radius="2dp"
      android:topRightRadius="0dp"
      android:bottomRightRadius="0dp"
      android:bottomLeftRadius="0dp" />
  <stroke
      android:width="1dp"
      android:color="@android:color/white" />
</shape>

で、android:background="@drawable/my_custom_background"を定義します。

テストはしていませんが、うまくいくはずです。

更新しました。

xml shapeの描画可能なリソースパワーを活用する方が、ニーズに合っていると思います。ゼロからのプロジェクト(android-8用)で、res/layout/main.xmlを定義します。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/border"
    android:padding="10dip" >
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Hello World, SOnich"
        />
    [... more TextView ...]
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Hello World, SOnich"
        />
</LinearLayout>

res/drawable/border.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
   <stroke
        android:width="5dip"
        android:color="@android:color/white" />
</shape>

gingerbread端末で動作することが報告されています。を関連付ける必要があることに注意してください。 android:padding をLinearLayoutの android:width shape/stroke の値です。を使用しないでください。 @android:color/white を最終的なアプリケーションで使用するのではなく、プロジェクトで定義された色を使用します。

を適用することができます。 android:background="@drawable/border" android:padding="10dip" を、提供されたサンプルのLinearLayoutのそれぞれに適用してください。

他の方の投稿で、LinearLayoutの背景に円を表示させたいとのことですが、Inset/Scale/Layerのdrawableリソースで遊んでいます( 描画可能なリソースを見る を参考に、LinearLayoutの背景に完全な円を表示するようなものを作ろうとしましたが、今のところ失敗しています...。

あなたの問題は、明らかに getBorder.set{Width,Height}(100); . なぜ、onClickメソッドでそのようなことをするのでしょうか?

ポイントを外さないためには、さらなる情報が必要です。なぜ、プログラム的にそれを行うのですか?動的な動作が必要なのでしょうか?入力のドローアブルはpngかShapeDrawableか、など。

続きは、明日、あなたが何を達成したいのか、より詳細な情報を提供し次第、お知らせします。