绘制带有圆angular的LinearLayout

我试图实现一个LinearLayout子类,它自身绘制圆angular。 从我的研究中,我设置了setWillNotDraw(false)并重写onDraw()在canvas中绘制一个圆angular的矩形:

 @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在这里看起来是正确的select(根据APIDemos的例子),但是应该是透明的区域(圆形的区域)具有黑色背景,并且儿童的angular落仍然可见。 这是Galaxy Nexus与Android 4.2.2的结果:

例

任何提示?

编辑:这是我想实现,对于粗略的照片购买:)

在这里输入图像说明

编辑2:我添加到GitHub一个示例runnable项目: https : //github.com/venator85/RoundClippingLayout

谢谢 ;)

Solutions Collecting From Web of "绘制带有圆angular的LinearLayout"

不太一样:Romain Guy做了一篇关于使用位图着色器在图像上裁剪angular落的博客post。不确定是否要扩展相同的东西。

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

尝试这个,

布局:-

 <?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> 

怎么样…

 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> 

我可以实现像这样的圆angular的LinearLayout。

在这里输入图像说明

步骤

1.创build一个自定义布局

 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> 

尝试这个 !! 从这个职位采取

将以下内容添加到文件(例如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> 

完成创build该文件后,只需使用以下其中一种方法设置背景:

通过代码:

 yourObject.setBackgroundResource(R.drawable.customshape); 

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

 android:background="@drawable/customshape" 

为什么不把剪贴画放在顶部,作为一种与背景颜色相匹配的框架?

[编辑:看起来像这样会被添加在L: https : //developer.android.com/preview/material/views-shadows.html#clip ,它允许你剪辑一个视图的矩形,圆形的形状,或圆形矩形绘制。]

我只是尝试了很长一段时间来自己做这个,并且得出这个答案 ,表明这是不可能的,因为View类是基于Rect类的。 我刚刚检查了源代码,从看起来似乎仍然如此。

摩托罗拉将在今年夏天晚些时候发布Moto 360(带圆脸的Android Wear手表),所以也许会有框架的更新,允许与矩形以外的形状的视图。