web-dev-qa-db-ja.com

Android:LinearLayoutに境界線を引く方法

3つのファイルがあります。 XML、描画関数、そしてメインアクティビティ。 XMLファイルにいくつかのLinearLayoutがあります。

<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をもう一度クリックすると、プログラムがクラッシュします。

もう1つ、LinearLayoutの中心に2つの円を描きたいのですが、どうすれば中心座標を把握できますか

176
SPG

あなたは本当にプログラムでそれをする必要がありますか?

タイトルだけを考えてみましょう:AndroidとしてShapeDrawableを使用できます:背景…

たとえば、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形の描画可能なリソースの力を利用するほうが良いと思います。 「最初から」プロジェクト(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デバイスで動作すると報告されています。 LinearLayoutのAndroid:paddingAndroid:widthの形状/ストロークの値に関連付ける必要があることに注意してください。最終的なアプリケーションでは@Android:color/whiteを使用せず、プロジェクト定義の色を使用してください。

提供されているサンプルの各LinearLayoutにAndroid:background="@drawable/border" Android:padding="10dip"を適用できます。

いくつかの円をLinearLayoutの背景として表示することに関する他の投稿としては、私はInset/Scale/Layer描画可能リソースを使って遊んでいます( 詳しくはDrawable Resources をご覧ください。 (情報)LinearLayoutの背景に完全な円を表示するように機能していますが、現時点では失敗しています…

あなたの問題は明らかにgetBorder.set{Width,Height}(100);の使用にあります。なぜあなたはonClickメソッドでそれをするのですか?

その点を見逃さないためにはさらに詳しい情報が必要です。動的な行動が必要ですか?あなたの入力ドロアブルはpngですかShapeDrawableは受け入れられますか?等.

続けるために(多分明日そしてあなたが達成したいことについてより多くの正確さを提供するとすぐに)…

419
Renaud

LinearLayout/RelativeLayoutを拡張してXML上でそのまま使用する

package com.pkg_name ;
...imports...
public class LinearLayoutOutlined extends LinearLayout {
    Paint paint;    

    public LinearLayoutOutlined(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        setWillNotDraw(false) ;
        Paint = new Paint();
    }
    public LinearLayoutOutlined(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        setWillNotDraw(false) ;
        Paint = new Paint();
    }
    @Override
    protected void onDraw(Canvas canvas) {
        /*
        Paint fillPaint = Paint;
        fillPaint.setARGB(255, 0, 255, 0);
        fillPaint.setStyle(Paint.Style.FILL);
        canvas.drawPaint(fillPaint) ;
        */

        Paint strokePaint = Paint;
        strokePaint.setARGB(255, 255, 0, 0);
        strokePaint.setStyle(Paint.Style.STROKE);
        strokePaint.setStrokeWidth(2);  
        Rect r = canvas.getClipBounds() ;
        Rect outline = new Rect( 1,1,r.right-1, r.bottom-1) ;
        canvas.drawRect(outline, strokePaint) ;
    }

}

<?xml version="1.0" encoding="utf-8"?>

<com.pkg_name.LinearLayoutOutlined
   xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:orientation="vertical"
    Android:layout_width=...
    Android:layout_height=...
   >
   ... your widgets here ...

</com.pkg_name.LinearLayoutOutlined>
15
Gabriel Riba