我正在尝试实现一个使用圆角绘制自己的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的结果:
任何提示?
编辑:这是我想要实现的目标,对于photoshopping的粗糙感到抱歉:)
编辑2:我向GitHub添加了一个可运行的示例项目:https://github.com/venator85/RoundClippingLayout
谢谢;)
答案 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。
步骤:
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手表),因此可能会对框架进行更新,允许使用除矩形以外的形状的视图。