绘制带圆角的LinearLayout

时间:2013-04-09 15:33:54

标签: android android-canvas

我正在尝试实现一个使用圆角绘制自己的LinearLayout子类。根据我的研究,我设置setWillNotDraw(false)并覆盖onDraw()在画布上绘制一个圆角矩形:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    int sc = canvas.saveLayer(0, 0, getWidth(), getHeight(), drawPaint, Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG
            | Canvas.FULL_COLOR_LAYER_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG);
    canvas.drawRoundRect(bounds, mCornerRadius, mCornerRadius, roundPaint);
    canvas.restoreToCount(sc);
}

其中:

drawPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
drawPaint.setColor(0xffffffff);
drawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));

roundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
roundPaint.setColor(0xffffffff);

DST_IN似乎是正确的选项(根据APIDemos示例),但应该是透明的区域(圆形的)具有黑色背景,并且子项的角仍然可见。这是使用Android 4.2.2的Galaxy Nexus的结果:

example

任何提示?

编辑:这是我想要实现的目标,对于photoshopping的粗糙感到抱歉:)

enter image description here

编辑2:我向GitHub添加了一个可运行的示例项目:https://github.com/venator85/RoundClippingLayout

谢谢;)

7 个答案:

答案 0 :(得分:7)

不太一样: Romain Guy发表了一篇关于使用位图着色器裁剪图像边角的博客文章。不确定是否要扩展相同的内容。

http://www.curious-creature.org/2012/12/11/android-recipe-1-image-with-rounded-corners/

答案 1 :(得分:5)

试试这个,

布局: -

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout 
        android:id="@+id/linearLayout"
        android:layout_width="300dp"
        android:gravity="center"
        android:layout_height="300dp"
        android:layout_centerInParent="true"
        android:background="@drawable/rounded_edge">
        <TextView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="foo" />
    </LinearLayout>
</RelativeLayout>

形状(可绘制对象): - rounded_edge.xml

<shape 
        xmlns:android="http://schemas.android.com/apk/res/android">
            <solid 
                android:color="@android:color/darker_gray">
            </solid>
            <stroke 
                 android:width="0dp" 
                 android:color="#424242">
            </stroke>
            <corners 
                 android:topLeftRadius="100dip"
                 android:topRightRadius="100dip"
                 android:bottomLeftRadius="100dip"
                 android:bottomRightRadius="100dip">
            </corners>
        </shape>

答案 2 :(得分:3)

我可以像这样使用圆角实现LinearLayout。

enter image description here

步骤

1。创建自定义布局

public class RoundedLayout extends LinearLayout {
    private RectF rect;
    private Paint paint;

    public RoundedLayout(Context context) {
        super(context);
        init();
    }
    public RoundedLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        rect = new RectF(0.0f, 0.0f, getWidth(), getHeight());
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.parseColor("#7EB5D6"));
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);           
        canvas.drawRoundRect(rect, 20, 20, paint);
    }
}

2. 在主要布局中使用它

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="#336699" >

    <com.example.rounded.RoundedLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:padding="30dp"
        android:background="@android:color/transparent" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="foo" />

    </com.example.rounded.RoundedLayout>    

</LinearLayout>

答案 3 :(得分:3)

试试这个!! 取自post

将以下内容添加到文件中(比如customshape.xml),然后将其放入(res / drawable / customshape.xml)

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
 android:shape="rectangle"> 
 <gradient 
     android:startColor="#SomeGradientBeginColor"
     android:endColor="#SomeGradientEndColor" 
     android:angle="270"/> 

<corners 
     android:bottomRightRadius="7dp" 
     android:bottomLeftRadius="7dp" 
     android:topLeftRadius="7dp" 
     android:topRightRadius="7dp"/> 
</shape> 

完成创建此文件后,只需使用以下方法之一设置背景:

通过代码:

yourObject.setBackgroundResource(R.drawable.customshape);

或者通过XML,只需将以下属性添加到容器中(例如:LinearLayout或任何字段):

android:background="@drawable/customshape"

答案 4 :(得分:2)

怎么样......

myLayout.setBackgroundResource(R.drawable.my_rounded_drawable);

则...

my_rounded_drawable.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <solid android:color="#FFFFFFFF" />
            <stroke android:width="1dip" android:color="#FF000000" />
            <corners android:radius="10dp" />
        </shape>
    </item>
</selector>

答案 5 :(得分:0)

为什么不将绘图放在它上面作为一种与背景颜色相匹配的框架,而不是试图削减布局的角落?

答案 6 :(得分:0)

[编辑:看起来会在L:https://developer.android.com/preview/material/views-shadows.html#clip中添加,这样您就可以将视图剪切为矩形,圆形或圆形矩形可绘制的形状。]

我自己尝试了很长时间,并且this answer认为这是不可能的,因为View类基于Rect类。我刚刚查看了源代码,并且从评论中看起来仍然如此。

摩托罗拉将在今年夏天晚些时候发布Moto 360(带圆脸的Android Wear手表),因此可能会对框架进行更新,允许使用除矩形以外的形状的视图。