Android : LinearLayout에 테두리를 그리는 방법


197

세 개의 파일이 있습니다. XML, 그리기 기능 및 주요 활동. LinearLayoutXML 파일에 일부 가 있습니다.

<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싶지만 어떻게 중심 좌표를 알아낼 수 있습니까?

답변:


459

프로그래밍 방식으로 그렇게해야합니까?

제목을 고려하면 : 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 형태의 드로어 블 리소스를 활용하는 것이 좋습니다. "처음부터"프로젝트 (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:paddingLinearLayout을 android:width셰이프 / 스트로크 값 과 관련시켜야 합니다. @android:color/white최종 응용 프로그램에 사용하지 말고 프로젝트 정의 색상을 사용하십시오.

android:background="@drawable/border" android:padding="10dip"제공된 샘플에서 각 LinearLayout에 적용 할 수 있습니다 .

LinearLayout의 배경으로 일부 원을 표시하는 것과 관련된 다른 게시물에 대해서는 Inset / Scale / Layer 드로어 블 리소스 ( 추가 정보는 드로어 블 리소스 참조 )를 사용하여 LinearLayout의 배경에서 완벽한 원을 표시하는 데 문제가 있지만 실패했습니다. 지금은 ...

귀하의 문제는의 사용에 명확하게 있습니다 getBorder.set{Width,Height}(100);. 왜 onClick 메소드에서 그렇게합니까?

요점을 놓치지 않으려면 추가 정보가 필요합니다. 왜 프로그래밍 방식으로 그렇게합니까? 역동적 인 행동이 필요하십니까? 입력 드로어 블이 png이거나 ShapeDrawable이 허용됩니까? 기타

계속 되려면 (내일이나 달성하고자하는 것에 대해 더 많은 정확성을 제공하자마자)…



@ Renaud는 테두리 색상을 문제 적으로 변경하는 방법이 있습니까?
user1940676

12
왜 그런지 확실하지 않지만, 이것을 사용했을 때 LinearLayout다음 자식을 shape요소에 추가하지 않으면 테두리 색상에서 단색으로 채워 <solid android:color="@android:color/transparent" />
졌습니다

2
나를 위해 그것은 내가 추가 한 것과 동일했다, <solid android:color="@color/lighter_gray" />그렇지 않으면 나는 검은 배경을 얻었다
Panciz

1
이 방법은 완벽하게 작동합니다. 그러나 배경을 "널"또는 "투명"으로 설정 한 경우에도 성능에 좋지 않은 두 개의 레이어 "오버 드로우"가 생성됩니다. 누구 든지이 문제를 해결할 수있는 방법을 제안 할 수 있습니까?
Sam Ramezanli

16

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>

34
onDraw()메소드에 메모리를 할당하지 말고 init()생성자가 호출 한 메소드 에서 오브젝트를 작성하여 메소드에서 재사용하십시오 onDraw(). 할당 onDraw()(초당 60 회라고 함)으로 인해 성능 저하, 배터리 소모 등
Louis CAD
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.