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つの円を描きたいのですが、どうすれば中心座標を把握できますか
あなたは本当にプログラムでそれをする必要がありますか?
タイトルだけを考えてみましょう: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:padding
をAndroid: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は受け入れられますか?等.
続けるために(多分明日そしてあなたが達成したいことについてより多くの正確さを提供するとすぐに)…
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>