Android: как рисовать границу с LinearLayout

У меня есть три файла. XML, функция draw и основная активность. У меня есть 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 , программа вылетает из строя.

Другое дело, я хочу нарисовать два круга в центре 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> 1 <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> 

И определите андроид: 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> 

Сообщается о работе на пряничном устройстве. Обратите внимание, что вам нужно будет связать android:padding добавление LinearLayout к значению android:width shape / stroke. Пожалуйста, не используйте @android:color/white в вашем конечном приложении, а скорее цвет, определенный проектом.

Вы можете применить android:background="@drawable/border" android:padding="10dip" для каждого из LinearLayout из предоставленного вами образца.

Что касается ваших других сообщений, связанных с отображением некоторых кругов в качестве фона LinearLayout, я играю с ресурсами для вставки / масштабирования / слоя ( см. «Ресурсы с возможностью рисования / слоя» для получения дополнительной информации), чтобы получить что-то, что работает, чтобы отображать идеальные круги на фоне 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>