怎样让linearlayout 圆角变圆角

&nbsp&#8250&nbsp&nbsp&#8250&nbsp
TV开发之如何绘制真正的圆角布局控件
一开始是这样的,热门的控件(LabeView),是三角形的,图片是圆角的.然后下面的TextView带背景颜色的是长方形的。都不是圆角.&【如何绘制真正的圆角矩形控件?】& & 一般 ImageView 使用 OnDraw,虽然能弄成圆角,比如在&FrameLayout( 就是继承ViewGroup的控件)下,它显示是正常的圆角。但是,如果再放一个文本(设置背景颜色)或者按钮,layout_width 占满 FrameLayout控件的话,你就发现,只是ImageView圆角了,Button或者文本 超出了ImageView的圆角,FrameLayout 并不是真正的圆角.& & 这样看来,这并不是我想要的效果。& & 继续分析源码.& &&【绘制过程分析】ImageView.java@Override&protected&void&onDraw(Canvas&canvas)&{& & super.onDraw(canvas);&& &&if&(mDrawable&==&null)&{& & & &&//&couldn't&resolve&the&URI& & }& & ... ...& &&mDrawable.draw(canvas);& & ... ...}如果你使用 setBackgroundDrawable 设置ImageView,那么mDrawable就是null.setBackgroundDrawable&是设置的背景,具体看 View.java.public&ImageView(Context&context,&AttributeSet&attrs,&int&defStyle)&{& & ... ...& & Drawable&d&=&a.getDrawable(com.android.internal.R.styleable.ImageView_src);& & if&(d&!=&null)&{& & & & setImageDrawable(d);& & ... ...}以上代码发现 src=&@dra...&如果你使用&setImageDrawable 设置ImageView,那么就将&mDrawable 绘制出来,&是我们设置ImageView 图片或者资源图片时候赋的.从上面的代码也分析的出来,ImageView的背景和src还有有区别的噢.有何种区别,继续看看源码.FrameLayout.javaFrameLayout 并没有重写&onDraw 函数, 看看继承的ViewGroup.public&void&setWillNotDraw(boolean&willNotDraw)&{& & setFlags(willNotDraw&?&WILL_NOT_DRAW&:&0,&DRAW_MASK);}ViewGroup.javaViewGroup 也没有重写&onDraw函数,再看看继承的View.View.javaView 找到了 onDraw 函数.protected&void&onDraw(Canvas&canvas)&{}不过它只是一个空函数,什么事情都没有做.来找找看,谁调用了 onDraw吧 ,不错就是 draw 函数.这是draw函数给出的注释。& & & &/*&&&&&&&&&*&Draw&traversal&performs&several&drawing&steps&which&must&be&executed&&&&&&&&&*&in&the&appropriate&order:&&&&&&&&&*&&&&&&&&&*&&&&&&1.&Draw&the&background&&&&&&&&&*&&&&&&2.&If&necessary,&save&the&canvas'&layers&to&prepare&for&fading&&&&&&&&&*&&&&&&3.&Draw&view's&content&&&&&&&&&*&&&&&&4.&Draw&children&&&&&&&&&*&&&&&&5.&If&necessary,&draw&the&fading&edges&and&restore&layers : 处理渐变&&&&&&&&&*&&&&&&6.&Draw&decorations&(scrollbars&for&instance)&&&&&&&&&*/public&void&draw(Canvas&canvas)&{& &&//&Step&1,&draw&the&background,&if&needed : &第一步,绘制背景.& & ... ...& &&if&(!dirtyOpaque)&{ // (A4)& & & & final&Drawable&background&=&mB // (A5)& & ... ...& &&//&Step&3,&draw&the&content:绘制本身的内容(一般继承viewGroup无).& & if&(!dirtyOpaque)&onDraw(canvas);& & //&Step&4,&draw&the&children:绘制子控件.& &&dispatchDraw(canvas);& & //&Step&5,&draw&the&fade&effect&and&restore&layers:渐变& & ... ...& &&//&Step&6,&draw&decorations&(scrollbars):绘制滚动条.& &&onDrawScrollBars(canvas);}如果不需要绘制渐变,则跳过第2和5步。A4:dirtyOpaque&表示 dirty 区是否是不透明 为 True, 透明为 false【一般Android的几乎都是透明的,都为false】.& & & & 如果View系统不支持Alpha通道,不需要绘制背景,因为视图本身会占满整个区域,背景会完全被挡住。A5:mBackground 就是设置背景时候传入的.dispatchDraw&内部绘制子控件,也是调用的childView.draw(... ...------------------通过上面的分析,我们大概知道了流程。android是如何绘制控件,以及子控件出来的。我们又知道clipPath这个函数,也知道&Path 这个函数.然后就可以开始着手写代码了.-------------------为了实现真正的圆角,我重写了 draw.@Overridepublic&void&draw(Canvas&canvas)&{&&&&&&&&//&设置圆角.&&&&&&&&canvas.save();&&&&&&&&if&(mIsDrawShape)&{&&&&&&&&&&&&canvas.clipPath(getShapePath());&&&&&&&&}&&&&&&&&super.draw(canvas);&&&&&&&&canvas.restore();}clipPath&可以让绘制的内容只在限制的区域内显示.那么 super.draw 绘制的控件内容,只能在 clipPath的区域显示了.如果你的区域是一个圆角的矩形,哈哈哈.现在无论放什么,都OK了.要了解更多,&下载源码 查看 ReflectItemView.java吧.来看看最后的效果吧.& &&& &&android 图片设置圆角 --技术博客-@大数据资讯
你好,游客
android 图片设置圆角 -
eoe社区相关的帖子:
Android 图片圆角
实现Android图片圆角(转载)
把图片变成圆角
-----------------------帖子正文---------------------
&?xml version=&1.0& encoding=&utf-8&?&
&LinearLayout xmlns:android=&/apk/res/android&
android:id=&@+id/layout&
android:orientation=&vertical&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
&/LinearLayout&
package com.test.
import android.app.A
import android.graphics.B
import android.graphics.Bitmap.C
import android.graphics.C
import android.graphics.C
import android.graphics.P
import android.graphics.PorterDuff.M
import android.graphics.PorterDuffX
import android.graphics.R
import android.graphics.RectF;
import android.graphics.drawable.BitmapD
import android.graphics.drawable.D
import android.os.B
import android.widget.ImageV
import android.widget.LinearL
public class MyActivity extends Activity {
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Drawable drawable = getResources().getDrawable(R.drawable.bg);
BitmapDrawable bitmapDrawable = (BitmapDrawable)
Bitmap bitmap = bitmapDrawable.getBitmap();
LinearLayout layout = (LinearLayout) findViewById(R.id.layout);
Drawable drawable = getResources().getDrawable(R.drawable.bg);
BitmapDrawable bitmapDrawable = (BitmapDrawable)
Bitmap bitmap = bitmapDrawable.getBitmap();
BitmapDrawable bbb = new BitmapDrawable(toRoundCorner(bitmap, 30));
layout.setBackgroundDrawable(bbb);
//ImageView imageView = (ImageView) findViewById(R.id.imgShow);
//imageView.setImageBitmap(MyActivity.getRoundedCornerBitmap(bitmap));
//imageView.setImageBitmap(MyActivity.toRoundCorner(bitmap, 20));
public static Bitmap toRoundCorner(Bitmap bitmap, int pixels) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
final float roundPx =
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
原文链接:
相关新闻 & & &温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(25320)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'LinearLayout设置白色背景、灰色边框、倒圆角',
blogAbstract:'\r\ndrawable-hdpi下面建一个xml,例如linearlayout.xml\r\n&?xml version=\"1.0\" encoding=\"utf-8\"?&& &shape xmlns:android=\"
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}}

我要回帖

更多关于 relativelayout 圆角 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信