android 画虚线、实线,画圆角矩形,一半圆角
- 格式:doc
- 大小:81.00 KB
- 文档页数:4
android 绘制图形(线段,圆,矩形等)1. 创建一个你自己的MyView 让他继承 View类实现onDraw 方法 这是主要的。
Java代码1.packagecom.wljie;2.3.importandroid.content.Context;4.5.importandroid.graphics.Canvas;6.7.importandroid.graphics.Color;8.9.importandroid.graphics.Paint;10.11.importandroid.view.View;12.13.publicclassMyViewextendsView{14.15.publicMyView(Contextcontext){16.17.super(context);18.19.//TODOAuto-generatedconstructorstub20.21.}22.23.@Override24.25.protectedvoidonDraw(Canvascanvas){26.27.super.onDraw(canvas);28.29.canvas.drawColor(Color.WHITE);30.31.Paintpaint=newPaint();//实例化paint类32.33.paint.setAntiAlias(true);//设置去锯齿34.35.paint.setColor(Color.RED);//设置paint的颜色是红色的36.37.paint.setStyle(Paint.Style.STROKE);//设置为空心的38.39.canvas.drawLine(0,0,100,100,paint);//划一条线段40.41.canvas.drawCircle(200,200,50,paint);//划一个空心圆42.43.}44.45.}2. 在activity 实例华这个类Java代码1.packagecom.wljie;2.3.importandroid.app.Activity;4.5.importandroid.graphics.Paint;6.7.importandroid.os.Bundle;8.9.importandroid.widget.Button;10.11.importandroid.widget.LinearLayout;12.13.publicclassMainextendsActivity{14.15./**Calledwhentheactivityisfirstcreated.*/16.17.18.@Override19.20.publicvoidonCreate(BundlesavedInstanceState){21.22.super.onCreate(savedInstanceState);23.24.//setContentView(yout.main);25.26.MyViewmyView=newMyView(this);27.28.setContentView(myView);29.30.}31.32.}图形的绘制在Android 中象图标的制作如:并行图,直方图用的比较多。
Android绘制图形(转)学习以前的⽂章⾥边画⼀般都是⼀些矩形,今天就看看怎么在android⼿机屏幕上绘制⼀些⼏何图形,如三⾓形、多边形、椭圆、圆形、正⽅形等等。
并且设置空⼼、实⼼。
下⾯我们先来看看在android中可以绘制出那些⼏何图形[color=#008000] ⽅法说明drawRect 绘制矩形drawCircle 绘制圆形drawOval 绘制椭圆drawPath 绘制任意多边形drawLine 绘制直线drawPoin 绘制点[/color]我们先来看看效果图吧:[align=center][/align][align=left] 下⾯我们就来看看代码是怎么做的:[/align][align=left][b]Java代码:[/b][/align][code]<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/hello"android:textColor="#00FF00"/><xiaohang.zhimeng.GameViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout>[/code][b]Java代码:[/b][code]package eoe.demo;import android.app.Activity;import android.os.Bundle;public class Activity01 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);}}[/code]GameView[b]Java代码:[/b][code]package eoe.demo;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.graphics.Rect;import android.graphics.RectF;import android.util.AttributeSet;import android.view.View;public class GameView extends View implements Runnable {// 声明Paint对象private Paint mPaint = null;private GameView2 mGameView2 = null;public GameView(Context context, AttributeSet attr){super(context,attr);System.out.println(1);// 构建画笔对象mPaint = new Paint();mGameView2 = new GameView2(context);// 开启线程new Thread(this).start();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 设置画布为⿊⾊背景canvas.drawColor(Color.BLACK);// 取消锯齿mPaint.setAntiAlias(true);// 设置画笔风格为空⼼mPaint.setStyle(Paint.Style.STROKE);{// 定义矩形对象Rect rect1 = new Rect();// 设置矩形⼤⼩rect1.left = 5;rect1.top = 5;rect1.bottom = 25;rect1.right = 45;mPaint.setColor(Color.BLUE);// 绘制矩形canvas.drawRect(rect1, mPaint);mPaint.setColor(Color.RED);// 绘制矩形canvas.drawRect(50, 5, 90, 25, mPaint);mPaint.setColor(Color.YELLOW);// 绘制圆形// 40 70 分别是圆⼼的X 和 Y坐标 30为半径 mPaint为画笔对象canvas.drawCircle(40, 70, 30, mPaint);// 定义椭圆RectF rectf1 = new RectF();rectf1.left = 80;rectf1.top = 30;rectf1.right = 120;rectf1.bottom = 70;mPaint.setColor(Color.LTGRAY);// 绘制椭圆canvas.drawOval(rectf1, mPaint);// 绘制多边形Path path1 = new Path();/*** 这个多变形我也没试验它到底是怎么画应该就是从起点找点⼀个点⼀个点的连线*/path1.moveTo(150 + 5, 80 - 50); // 此点为多边形的起点path1.lineTo(150 + 45, 80 - 50);path1.lineTo(150 + 30, 120 - 50);path1.lineTo(150 + 20, 120 - 50);// 使这些点构成封闭的多边形path1.close();mPaint.setColor(Color.GRAY);// 绘制这个多边形canvas.drawPath(path1, mPaint);mPaint.setColor(Color.RED);// 设置画笔空⼼边框的宽度mPaint.setStrokeWidth(3);// 绘制直线// 这个绘制直线的⽅法前2个参数是前点坐标后 2个参数是终点坐标我们可看出两个点的Y坐标都⼀样的canvas.drawLine(5, 110, 315, 110, mPaint);}// 绘制实⼼⼏何体// 将画笔设置为实⼼mPaint.setStyle(Paint.Style.FILL);{// 定义矩形Rect rect1 = new Rect();rect1.left = 5;rect1.top = 130 + 5;rect1.bottom = 130 + 25;rect1.right = 45;mPaint.setColor(Color.BLUE);// 绘制矩形canvas.drawRect(rect1, mPaint);mPaint.setColor(Color.RED);// 绘制矩形canvas.drawRect(50, 130 + 5, 90, 130 + 25, mPaint);mPaint.setColor(Color.YELLOW);// 绘制圆形这⾥参数就不说明了上边已经说了canvas.drawCircle(40, 130 + 70, 30, mPaint);// 定义椭圆对象RectF rectf1 = new RectF();// 设置椭圆⼤⼩rectf1.left = 80;rectf1.top = 130+30;rectf1.right = 120;rectf1.bottom = 130 + 70;mPaint.setColor(Color.LTGRAY);// 绘制椭圆canvas.drawOval(rectf1, mPaint);// 绘制多边形Path path1 = new Path();// 设置多边形的点path1.moveTo(150+5, 130+80-50);path1.lineTo(150+45, 130+80-50);path1.lineTo(150+30, 130+120-50);path1.lineTo(150+20, 130+120-50);// 使这些点构成封闭的多边形path1.close();mPaint.setColor(Color.GRAY);// 绘制这个多边形canvas.drawPath(path1, mPaint);mPaint.setColor(Color.RED);mPaint.setStrokeWidth(3);// 绘制直线canvas.drawLine(5, 130 + 110, 315, 130 + 110, mPaint);}// 通过ShapDrawable来绘制⼏何图形mGameView2.DrawShape(canvas);}@Overridepublic void run() {while (!Thread.currentThread().isInterrupted()) {try {Thread.sleep(100);} catch (InterruptedException e) {Thread.currentThread().interrupt();}// 使⽤postInvalidate可以直接在线程中更新界⾯postInvalidate();}}}[/code]在android中还可以通过ShapDrawable来绘制图像,ShapDrawable可以设置画笔的形状。
Android实现代码画虚线边框背景效果实现如下边框效果:虚线画效果,可以使⽤Android中的xml来做。
下⾯话不多说,直接上代码:<RelativeLayoutandroid:id="@+id/coupon_popup"android:layout_width="320dp"android:layout_height="200dp"android:layout_margin="20dp"android:gravity="center_vertical"android:background="@drawable/bg_border_stroke">写⼀个 bg_border_stroke的xml做背景。
bg_border_stroke.xml<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="/apk/res/android" ><item><shape><strokeandroid:width="1dp"android:color="#E8A227" /><solid android:color="#FFFFFF" /><corners android:radius="5dp" /></shape></item><itemandroid:bottom="1dp"android:left="1dp"android:right="1dp"android:top="1dp"><shape><strokeandroid:dashGap="15dp"android:dashWidth="15dp"android:width="2.5dp"android:color="#E8A227" /><solid android:color="#FFFFFF" /><corners android:radius="5dp" /></shape></item></layer-list>总结以上就是这篇⽂章的全部内容了,希望本⽂的内容对各位Android开发者能有⼀定的帮助,如果有疑问⼤家可以留⾔交流。
Android中Shape的⽤法详解ShapeDrawable是⼀种很常见的Drawable,可以理解为通过颜⾊来构造的图形,它既可以是纯⾊的图形,也可以是具有渐变效果的图形,ShapeDrawabled语法稍显复杂,如下所⽰:<shapexmlns:android="/apk/res/android"android:shape=["rectangle" | "oval" | "line" | "ring"] ><cornersandroid:radius="integer"android:topLeftRadius="integer"android:topRightRadius="integer"android:bottomLeftRadius="integer"android:bottomRightRadius="integer" /><gradientandroid:angle="integer"android:centerX="integer"android:centerY="integer"android:centerColor="integer"android:endColor="color"android:gradientRadius="integer"android:startColor="color"android:type=["linear" | "radial" | "sweep"]android:useLevel=["true" | "false"] /><paddingandroid:left="integer"android:top="integer"android:right="integer"android:bottom="integer" /><sizeandroid:width="integer"android:height="integer" /><solidandroid:color="color" /><strokeandroid:width="integer"android:color="color"android:dashWidth="integer"android:dashGap="integer" /></shape>•Android: shape•有4个选项,rectangle(矩形)oval(椭圆)line(横线)ring(圆环),默认为rectangle,需要注意line和ring需要通过标签来指定线的宽度和颜⾊等信息,否则⽆法达到预期效果•⾸先来说⼀下最常⽤的rectangle(矩形),⼀般都是在按钮或者字体上⾯设置⼀个background的Drawable。
Android布局实现圆⾓边框⾸先,在res下⾯新建⼀个⽂件夹drawable,在drawable下⾯新建三个xml⽂件:shape_corner_down.xml、shape_corner_up.xml和shape_corner.xml,分别是下⾯两个⾓是圆⾓边框,上⾯两个⾓是圆⾓边框,四个⾓全部是圆⾓边框。
shape_corner_down.xml:1 2 3 4 5 6 7<?xml version="1.0"encoding="utf-8"?><shape xmlns:android=""><solid android:color="#0099CC"/><corners android:bottomRightRadius="20dp"android:bottomLeftRadius="20dp"/><stroke android:width="1dp"android:color="#000000"/> </shape>shape_corner_up.xml:1 2 3 4 5 6 7<?xml version="1.0"encoding="utf-8"?><shape xmlns:android=""><solid android:color="#CCCC99"/><corners android:topLeftRadius="20dp"android:topRightRadius="20dp"/><stroke android:width="1dp"android:color="#000000"/> </shape>shape_corner.xml:1 2 3 4 5 6 7 8 9<?xml version="1.0"encoding="utf-8"?><shape xmlns:android=""><solid android:color="#99CCFF"/><corners android:topLeftRadius="20dp"android:topRightRadius="20dp"android:bottomRightRadius="20dp"android:bottomLeftRadius="20dp"/><stroke android:width="1dp"android:color="#000000"/> </shape><solid android:color>设置了背景颜⾊。
Android对控件设置边框样式(边框颜⾊,圆⾓)和图⽚样式(圆⾓)1、设置边框、圆⾓、背景⾊案例在drawable中新建⼀个edge.xml⽂件<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="/apk/res/android"><!-- 这⾥是设置背景⾊--><solid android:color="@color/colorGrey"/><!-- 这⾥是设置为四周也可以单独设置某个位置为圆⾓--><corners android:topLeftRadius="5dp"android:topRightRadius="5dp"android:bottomRightRadius="5dp"android:bottomLeftRadius="5dp"/><!-- 这⾥设置边框 --><stroke android:width="1dp" android:color="#000000"/></shape>Activity页⾯引⽤:android:background="@drawable/edge"如下案例所⽰:<ScrollViewandroid:id="@+id/scrollView2"android:layout_width="0dp"android:layout_height="0dp"android:layout_marginStart="8dp"android:layout_marginTop="8dp"android:layout_marginEnd="8dp"android:layout_marginBottom="8dp"app:layout_constraintBottom_toTopOf="@+id/guideline"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.0"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.0"android:background="@drawable/edge"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><TextViewandroid:id="@+id/et"android:layout_width="match_parent"android:layout_height="wrap_content"android:minLines="8"android:text="123456789"/></LinearLayout></ScrollView>说明: solid为填充⾊即内部的背景填充⾊,stroke 为边框可以设置颜⾊和宽度效果如下:2、设置边框颜⾊案例:在drawable中新建⼀个button_edge.xml⽂件<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="/apk/res/android"><!-- 边框颜⾊值 --><item><shape><solid android:color="#3bbaff"/></shape></item><!--这个是按钮边框设置为四周并且宽度为1--><itemandroid:right="1dp"android:left="1dp"android:top="1dp"android:bottom="1dp"><shape><!--这个是背景颜⾊--><solid android:color="#ffffff"/><!--这个是按钮中的字体与按钮内的四周边距--><padding android:bottom="5dp"android:left="5dp"android:right="5dp"android:top="5dp"/></shape></item></layer-list>使⽤:android:background="@drawable/button_edge"3、设置圆⾓按钮案例:(其实按钮还是⽅形的,只是将外围部分隐藏了⽽已)在drawable中:新建⼀个 button_circle_shape.xml⽂件<?xml version="1.0" encoding="UTF-8"?><shapexmlns:android="/apk/res/android"android:shape="rectangle"><!-- 填充的颜⾊ --><solid android:color="#FFFFFF"/><!-- android:radius 弧形的半径 --><!-- 设置按钮的四个⾓为弧形 --><cornersandroid:radius="5dip"/><!--也可单独设置--><!-- <corners --><!-- android:topLeftRadius="10dp"--><!-- android:topRightRadius="10dp"--><!-- android:bottomRightRadius="10dp"--><!-- android:bottomLeftRadius="10dp"--><!-- /> -->**设置⽂字padding**<!-- padding:Button⾥⾯的⽂字与Button边界的间隔 --><paddingandroid:left="10dp"android:top="10dp"android:right="10dp"android:bottom="10dp"/></shape>使⽤:android:background="@drawable/shape"4、设置圆⾓图⽚案例1 简单的设置:(不能添加⾃定义图⽚只能设置颜⾊和字体)在drawable中创建⼀个image_circle.xml图⽚<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="/apk/res/android"><solid android:color="#FFFFFF"/><corners android:topLeftRadius="10dp"android:topRightRadius="10dp"android:bottomRightRadius="10dp"android:bottomLeftRadius="10dp"/></shape>使⽤:android:background="@drawable/image_circle"5、真实案例:edge.xml<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="/apk/res/android"><!-- 边框颜⾊值 --><item><shape><solid android:color="#3bbaff"/></shape></item><!--这个是按钮边框设置为四周并且宽度为1--><itemandroid:right="1dp"android:left="1dp"android:top="1dp"android:bottom="1dp"><shape><!--这个是背景颜⾊--><solid android:color="#ffffff"/><!--这个是按钮中的字体与按钮内的四周边距--><padding android:bottom="5dp"android:left="5dp"android:right="5dp"android:top="5dp"/></shape></item></layer-list>布局⽂件 LeftFragment.xml:<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="/apk/res/android" xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".LeftFragment"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="center"android:orientation="vertical"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:orientation="horizontal"android:padding="10dp"><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:src="@mipmap/user"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:text="⼿⼯登录"android:textSize="20sp"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:padding="10dp"android:background="@drawable/edge"android:layout_marginLeft="5dp"android:layout_marginRight="5dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingLeft="20dp"android:text="账号"android:textSize="15sp"/><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输⼊⼯⼚管理系统账号"android:background="@null"android:paddingLeft="10dp"android:textSize="15sp"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:padding="10dp"android:background="@drawable/edge"android:layout_marginLeft="5dp"android:layout_marginRight="5dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingLeft="20dp"android:textSize="15sp"android:text="密码"/><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输⼊⼯⼚管理系统登录密码" android:background="@null"android:paddingLeft="10dp"android:textSize="15sp"/></LinearLayout><CheckBoxandroid:layout_width="match_parent"android:layout_height="wrap_content"android:padding="10dp"android:text="记住密码"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:padding="10dp"android:text="登录"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="登录出现问题?"/></LinearLayout></FrameLayout>。
使用XML的方式为背景添加渐变的效果首先,在res/Drawable 文件夹里面添加一个jbshape.xml文件,然后写入如下代码:shape 节点配置的是图形的形式,主要包括方形、圆形等,上边代码为方形,gradient节点主要配置起点颜色、终点颜色及中间点的颜色、坐标、渐变效果(0,90,180从左到右渐变,270从上到下渐变)默认从左到右padding 节点主要配置上下左右的间距corners 节点配置四周园脚的半径实现这个效果,需要定一个title.xml 内容如下:<?xml version=”1.0″ encoding=”UTF-8″?><LinearLayout xmlns:android=”/apk/res/android”android:orientation=”vertical”android:layout_width=”fill_parent”android:layout_height=”fill_parent”android:background=”@drawable/jbshape”android:paddingLeft=”0px”>在实现背景渐变的帖子里/blog/1238909有朋友建议看看shape的用法,确实很有帮助。
这里我偷懒转一篇比较详细的帖子,和大家一起进步~!Android中常常使用shape来定义控件的一些显示属性,今天看了一些shape的使用,对shape有了大体的了解,稍作总结:先看下面的代码:复制到剪贴板XML/HTML代码1.<shape>2.<!-- 实心-->3. <solidandroid:color="#ff9d77"/>4.<!-- 渐变-->5. <gradient6. android:startColor="#ff8c00"7. android:endColor="#FFFFFF"8. android:angle="270"/>9.<!-- 描边-->10. <stroke11. android:width="2dp"12. android:color="#dcdcdc"/>13.<!-- 圆角-->14. <corners15. android:radius="2dp"/>16. <padding17. android:left="10dp"18. android:top="10dp"19. android:right="10dp"20. android:bottom="10dp"/>21.</shape>solid:实心,就是填充的意思android:color指定填充的颜色gradient:渐变android:startColor和android:endColor分别为起始和结束颜色,ndroid:angle是渐变角度,必须为45的整数倍。
Android⾃定义Drawable实现圆⾓效果Drawable是⼀种可绘制资源的载体,如图形、图像等。
在实际开发中可以作为view的背景。
主要有静态和动态两种⽅式,静态通过xml描述使⽤,动态即⾃定义Drawable。
本⽂实现⼀个圆形和圆⾓的背景图⽚效果。
效果图:实现⽅式:1.初始化⼀个BitmapShader着⾊器对象;2.将着⾊器对象set给画笔;3.在画布上绘制圆或圆⾓即可;4.使⽤,view.setBackgroundDrawable或者 ImageView.setImageDrawablepackage com.mydrawable.musk;import android.graphics.Bitmap;import android.graphics.BitmapShader;import android.graphics.Canvas;import android.graphics.ColorFilter;import android.graphics.Paint;import android.graphics.PixelFormat;import android.graphics.Shader;import android.graphics.drawable.Drawable;/*** Created by musk.*/public class CircleDrawable extends Drawable {private Paint mPaint;private int mWidth;private Bitmap mBitmap;public CircleDrawable(Bitmap bitmap) {mBitmap = bitmap;//着⾊器,设置横向和纵向的着⾊模式为平铺BitmapShader bitmapShader = new BitmapShader(mBitmap,Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);mPaint = new Paint();mPaint.setAntiAlias(true);mPaint.setDither(true);mPaint.setShader(bitmapShader);mWidth = Math.min(mBitmap.getWidth(), mBitmap.getHeight());}//绘制@Overridepublic void draw(Canvas canvas) {canvas.drawCircle(mWidth / 2, mWidth / 2, mWidth / 2, mPaint);}//设置透明度值@Overridepublic void setAlpha(int alpha) {mPaint.setAlpha(alpha);}//设置颜⾊过滤器@Overridepublic void setColorFilter(ColorFilter colorFilter) {mPaint.setColorFilter(colorFilter);}//返回不透明度@Overridepublic int getOpacity() {return PixelFormat.TRANSLUCENT;}//返回图⽚实际的宽⾼@Overridepublic int getIntrinsicWidth() {return mWidth;}@Overridepublic int getIntrinsicHeight() {return mWidth;}}⾃定义Drawable有五个⽅法必须覆写,draw()、setAlpha()、setColorFilter()、getOpacity(),另外的getIntrinsicWidth()和getIntrinsicHeight()是在view设置wrap_content时设置drawable的宽度和⾼度。
一种android中实现“圆角矩形”的方法内容简介文章介绍ImageView(方法也可以应用到其它View)圆角矩形(包括圆形)的一种实现方式,四个角可以分别指定为圆角。
思路是利用“Xfermode + Path”来进行Bitmap的裁剪。
背景圆角矩形实现的方法应该很多,网上一大堆。
很怀疑为啥安卓的控件不内置这样的属性(我不知道有)?之前用到的网络图片加载库(UniversalImageLoader等)都自带“圆形图片”这样的功能。
这次需要的效果是圆角矩形,而且只有图片上面左、右两个角是圆角。
然后藐似没发现有这种功能,刚好就自己实践下了。
一个需要强调的事实就是,像ImageView这样的控件,它可以是wrap_content这样的,最终大小不定,由对应的Drawable或Bitmap资源决定其大小。
另一种情况下ImageView的大小是固定的,此时图片的实际填充效果(可视范围)受到scaleType的影响,不一定和View大小一致,不过往往会保持图片宽高比例,使得最终ImageView的宽高和显示的图片是一致的。
在画布上进行裁剪时,必须明确要操作的相关Bitmap的尺寸。
由于上面的原因,根据实际ImageView大小的确定方式不同,要么是取ImageView的大小来作为整个“圆角矩形”的范围,要么是以实际展示的Bitmap的大小为准。
下面采取自定义ImageView子类的形式提供案例来说明“Xfermode + Path”实现圆角矩形的思路。
而且会以ImageView固定大小(图片填充,scaleType=fitXY)的形式,也就是说要显示的图片是完全填充ImageView的,它们一样大小。
如果以Bitmap为准,那么就得自己去设法得到原本ImageView的“设置下”显示的图片的范围,然后对应的去裁剪。
这里为突出重点,就不考虑那么多了(^-^)。
clipPath()版本方法android.graphics.Canvas#clipPath(android.graphics.Path)用来沿着Path指定的路线从目前的canvas裁剪出新的区域的canvas,就是改变了画布的可绘制区域。
Android原⽣绘图⼯具Canvas详细⽬录1.Canvas提供的绘制函数2.绘制背景3.绘制矩形drawRect4.绘制圆⾓矩形drawRoundRect5.绘制圆形drawCircle6.绘制路径drawPath7.绘制直线drawLine8.绘制圆弧drawArc9.绘制椭圆drawOval10.绘制点drawPoint11.绘制⽂本drawText 沿路径绘制⽂本drawTextOnPath12.绘制bitmap drawBitmap如果对上⼀篇感兴趣的话可以看看下⾯步⼊正题:先看看效果图1.Canvas提供的绘制函数canvas.drawColor();canvas.drawRGB();canvas.drawRect();canvas.drawRoundRect();canvas.drawCircle();canvas.drawPath();canvas.drawLine();canvas.drawArc();canvas.drawOval();canvas.drawPoint();canvas.drawPoints();canvas.drawText();canvas.drawTextOnPath();canvas.drawBitmap();2.绘制背景⽤于初始化和清空画布//绘制颜⾊,默认模式public void drawColor(@ColorInt int color) {super.drawColor(color);}//颜⾊绘制,设置modepublic void drawColor(@ColorInt int color, @NonNull PorterDuff.Mode mode) {super.drawColor(color, mode);}//参数0-255public void drawARGB(int a, int r, int g, int b) {super.drawARGB(a, r, g, b);}//参数0-255public void drawRGB(int r, int g, int b) {super.drawRGB(r, g, b);}第⼆个函数中⽤到PorterDuff.Mode,PorterDuff.Mode主要⽤于图像混合模式,后⾯细说//传⼊RectFpublic void drawRect(@NonNull RectF rect, @NonNull Paint paint) {super.drawRect(rect, paint);}//传⼊Rectpublic void drawRect(@NonNull Rect r, @NonNull Paint paint) {super.drawRect(r, paint);}//把Rect的四个点坐标传⼊public void drawRect(float left, float top, float right, float bottom, @NonNull Paint paint) {super.drawRect(left, top, right, bottom, paint);}Rect 和RectF都是提供⼀个矩形局域。
Android切圆⾓的⼏种常见⽅式总结Android 中有哪些可以切圆⾓的实现⽅式呢?本⽂总结⼀下常⽤的⽅式。
以下内容分为以下⼏部分:1. 利⽤ Drawable 的 shape xml 实现2. CardView 实现圆⾓3. fresco 中的 SimpleDraweeView 实现圆⾓4. 利⽤ View 的 ViewOutlineProvider 实现圆⾓5. 总结1. 利⽤ Drawable 的 shape xml 实现很多时候,我们可以⾃定义⼀些 drawable , 代码如下:<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="/apk/res/android"><corners android:radius="15dp"/><solid android:color="#FFFFFF"/><stroke android:width="1dp" android:color="#EBEBEB"/></shape>其中,corners 就是我们实现的圆⾓,这⾥指定圆⾓的半径为 15dp。
solid 是指填充⾊,这⾥为⽩⾊;stroke 为drawable 的边缘宽度和颜⾊设置,这⾥为 1dp 颜⾊⽐⽩⾊⿊⼀点。
如果知识想要「圆⾓」的话,可以不需要指定 stroke然后在我们需要的 View 上,设置它的 background 为该 drawable 即可.效果为:drawable 圆⾓本质是在 background 上加了圆⾓。
2. CardView 的圆⾓CardView 是⾃带圆⾓实现的,我们只需要在它的定义中加⼀句 app:cardCornerRadius="8dp" 即可。
Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)标签:图形androidpathfloatclass2012-01-20 20:02 151861人阅读评论(64) 收藏举报分类:android(12)版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+] 1、首先说一下canvas类:Class OverviewThe Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into the bitmap), a drawing primitive (e.g. Rect, Path, text, Bitmap), and a paint (to describe the colors and styles for the drawing).这个类相当于一个画布,你可以在里面画很多东西;我们可以把这个Canvas理解成系统提供给我们的一块内存区域(但实际上它只是一套画图的API,真正的内存是下面的Bitmap),而且它还提供了一整套对这个内存区域进行操作的方法,所有的这些操作都是画图API。
也就是说在这种方式下我们已经能一笔一划或者使用Graphic来画我们所需要的东西了,要画什么要显示什么都由我们自己控制。
这种方式根据环境还分为两种:一种就是使用普通View的canvas画图,还有一种就是使用专门的SurfaceView的canvas来画图。
两种的主要是区别就是可以在SurfaceView中定义一个专门的线程来完成画图工作,应用程序不需要等待View的刷图,提高性能。
Android实现圆形图⽚或者圆⾓图⽚Android圆形图⽚或者圆⾓图⽚的快速实现,具体内容如下话不多说直接上codexml⽂件布局<LinearLayoutandroid:id="@+id/ll_headpict"android:layout_width="match_parent"android:layout_height="97dp"android:layout_margin="13dp"android:background="@drawable/shape_white_radius10_solid"android:gravity="center_vertical"android:orientation="horizontal"android:paddingLeft="25dp"><TextViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="头像"android:textColor="@color/color4A4A4A"android:textSize="14sp"android:textStyle="bold" /><ImageViewandroid:id="@+id/iv_headpict"android:layout_width="60dp"android:layout_height="60dp"android:layout_marginRight="37dp"android:scaleType="fitXY"android:src="@mipmap/ic_headview_demo" /></LinearLayout>初始化控件之后⽤⼯具类加载//第⼀个参数上下⽂,第⼆个控件名称,第三个图⽚url地址,第四个参数圆⾓⼤⼩ViewUtils.loadImageRadius(this, mIvpict, stringUrl, 15);//头像ViewUtils.java⼯具类/*** Created by wjw on 2016/11/28* 倒圆⾓⼯具类*/public class ViewUtils {/*** 图⽚加载* @param context* @param iv* @param url*/public static void loadImage(Context context, ImageView iv, String url) {if(null ==context || null==iv){return;}if(Utils.isTxtEmpty(url)){try {Glide.with(context).load(R.mipmap.placeholder_icon) .dontAnimate().diskCacheStrategy(DiskCacheStrategy.ALL).into(iv);}catch (Exception e){}}else {try {Glide.with(context).load(url) .dontAnimate().diskCacheStrategy(DiskCacheStrategy.ALL).placeholder(R.mipmap.placeholder_icon).into(iv); } catch (Exception e) {}}}public static void loadImage(Context context, ImageView iv, int id) {if(null ==context || null==iv){return;}try {Glide.with(context).load(id) .dontAnimate().diskCacheStrategy(DiskCacheStrategy.ALL).placeholder(R.mipmap.placeholder_icon).into(iv); }catch (Exception e){}}/*** 本地图⽚* @param context* @param iv* @param id* @param radius*/public static void loadImage(Context context, ImageView iv, int id,int radius) {if(null ==context || null==iv){return;}try {Glide.with(context).load(id) .dontAnimate().diskCacheStrategy(DiskCacheStrategy.ALL).transform(new GlideRoundTransform(context, radius)).into(iv);}catch (Exception e){}}public static void setImageResource(ImageView iv, int id) {if(null!=iv){iv.setImageResource(id);}}/*** 加载⽹络图⽚(带圆⾓)* @param context* @param iv* @param url* @param radius*/public static void loadImageRadius(Context context, ImageView iv, String url, int radius) {if(null ==context || null==iv){return;}if(Utils.isTxtEmpty(url)){try {Glide.with(context).load(R.mipmap.placeholder_icon) .dontAnimate().diskCacheStrategy(DiskCacheStrategy.ALL).transform(new GlideRoundTransform(context, radius)).into(iv);}catch (Exception e){}}else{try {Glide.with(context).load(url) .dontAnimate().diskCacheStrategy(DiskCacheStrategy.ALL).transform(new GlideRoundTransform(context, radius)).placeholder(R.mipmap.placeholder_icon).into(iv);}catch (Exception e){}}}/*** 加载⽹络图⽚(圆形)* @param context* @param iv* @param url*/public static void loadImageCircle(Context context, ImageView iv, String url) {if(null ==context || null==iv){return;}if (Utils.isTxtEmpty(url)) {try {Glide.with(context).load(R.mipmap.placeholder_icon) .dontAnimate().diskCacheStrategy(DiskCacheStrategy.ALL).transform(new GlideCircleTransform(context)).into(iv);}catch (Exception e){}} else {try {Glide.with(context).load(url) .dontAnimate().diskCacheStrategy(DiskCacheStrategy.ALL).transform(new GlideCircleTransform(context)). placeholder(R.mipmap.placeholder_icon).into(iv);}catch (Exception e){}}}}效果如图圆⾓图⽚以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
Android绘图机制(二)——自定义View 绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解我们要想画好一些炫酷的View,首先我们得知道怎么去画一些基础的图案,比如矩形,圆形,三角形,多边形等….新建一个项目然后我们创建一个listview,每个图案一个Activity,这样看起来是不是很顺眼<ListViewandroid:id="@+id/listview"android:layout_width="wrap_content"android:layout_height="wrap_content" />编写ListViewprivate ListView listview;//item上的数据源private String[] name = {"矩形", "圆形", "三角形", "扇形", "椭圆", "曲线","文字和图片"};//listview的adapterprivate ArrayAdapter<String>adapter;private void initView() {//实例化listviewlistview = (ListView) findViewById(R.id.listview);//实例化数据源adapter = new ArrayAdapter<String>(this, yout.simple_list_item_1, name);//listview设置adapterlistview.setAdapter(adapter);//listview设置点击事件listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {//判断点击了第几个if (id == 0) {//矩形startActivity(new Intent(MainActivity.this, RectActivity.class));} else if (id == 1) {//圆形startActivity(new Intent(MainActivity.this, CircleActivity.class));} else if (id == 2) {//三角形startActivity(new Intent(MainActivity.this, TrigonActivity.class));} else if (id == 3) {//扇形startActivity(new Intent(MainActivity.this, SectorActivity.class));} else if (id == 4) {//椭圆startActivity(new Intent(MainActivity.this, OvalActivity.class));} else if (id == 5) {//曲线startActivity(new Intent(MainActivity.this, PathActivity.class));}else if (id == 6) {//曲线startActivity(new Intent(MainActivity.this, TvIvActivity.class));}}});}效果是这样的后续可以添加1.矩形——RectActivity好的,上面写ListView的代码是不是很简单?拿我们新建一个RectActivity去画点了,首先我们要新建一个RectView继承Viewpackage com.lgl.view.view;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.util.AttributeSet;import android.view.View;/*** 矩形* Created by LGL on 2016/1/7.*/public class RectView extends View {//无参public RectView(Context context) {super(context);}//有参public RectView(Context context, AttributeSet attrs) { super(context, attrs);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 创建画笔Paint p = new Paint();//设置实心p.setStyle(Paint.Style.FILL);// 设置红色p.setColor(Color.BLACK);// 设置画笔的锯齿效果p.setAntiAlias(true);//绘制canvas.drawRect(50, 100, 300, 300, p);}}截图1.圆形——CircleActivity我们还是新建一个CircleActivity去画点了,首先我们要新建一个CircleView继承View package com.lgl.view.view;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.util.AttributeSet;import android.view.View;import android.view.WindowManager;/*** 圆* Created by LGL on 2016/1/7.*/public class CircleView extends View {int width;int height;//无参public CircleView(Context context) {super(context);init();}//有参public CircleView(Context context, AttributeSet attrs) {super(context, attrs);init();}private void init() {//获取屏幕的宽高//Android绘图机制(一)——自定义View的基础属性和方法里面有讲WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);width = wm.getDefaultDisplay().getWidth();height = wm.getDefaultDisplay().getHeight();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Paint p = new Paint();p.setColor(Color.BLACK);// 设置画笔的锯齿效果p.setAntiAlias(true);canvas.drawCircle(width / 2, height / 2, width / 2, p);}}截图3.三角形——TrigonActivity我们还是新建一个TrigonActivity去画点了,首先我们要新建一个trigonView继承View package com.lgl.view.view;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.util.AttributeSet;import android.view.View;/*** 三角形* Created by LGL on 2016/1/7.*/public class TrigonView extends View {//无参public TrigonView(Context context) {super(context);}//有参public TrigonView(Context context, AttributeSet attrs) { super(context, attrs);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Paint p = new Paint();p.setColor(Color.BLACK);//实例化路径Path path = new Path();path.moveTo(80, 200);// 此点为多边形的起点path.lineTo(120, 250);path.lineTo(80, 250);path.close(); // 使这些点构成封闭的多边形canvas.drawPath(path, p);}}4.扇形——SectorActivitypackage com.lgl.view.view;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color;import android.graphics.Paint;import android.graphics.RectF;import android.util.AttributeSet;import android.view.View;/*** 扇形* Created by LGL on 2016/1/8.*/public class SectorView extends View {public SectorView(Context context) {super(text);}public SectorView(Context context, AttributeSet attrs) { super(context, attrs);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 创建画笔Paint p = new Paint();p.setColor(Color.BLACK);RectF rectF = new RectF(60, 100, 200, 240);canvas.drawArc(rectF, 200, 130, true, p);}}5.椭圆——OvalActivitypackage com.lgl.view.view;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.util.AttributeSet; import android.view.View;/*** 椭圆* Created by LGL on 2016/1/8.*/public class OvalView extends View {public OvalView(Context context) {super(context);}public OvalView(Context context, AttributeSet attrs) { super(context, attrs);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 创建画笔Paint p = new Paint();p.setColor(Color.BLACK);RectF rectF = new RectF(60, 100, 200, 240);rectF.set(210,100,250,130);canvas.drawOval(rectF, p);}}椭圆的思路和扇形是一样的,这里就不演示了截图6.曲线——PathActivitypackage com.lgl.view.view;import android.content.Context;import android.graphics.Canvas; import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.util.AttributeSet; import android.view.View;/*** Created by LGL on 2016/1/8.*/public class PathView extends View {public PathView(Context context) {super(context);}public PathView(Context context, AttributeSet attrs) {super(context, attrs);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 创建画笔Paint p = new Paint();p.setColor(Color.BLACK);p.reset();//设置空心p.setStyle(Paint.Style.STROKE);Path path = new Path();path.moveTo(100, 320);//设置Path的起点path.quadTo(150, 310, 170, 400); //设置路径点和终点canvas.drawPath(path, p);}}截图7.文字和图片——TvIvActivitypackage com.lgl.view.view;import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color;import android.graphics.Paint;import android.util.AttributeSet; import android.view.View;import com.lgl.view.R;/*** Created by LGL on 2016/1/8.*/public class TvIvView extends View {public TvIvView(Context context) {super(context);}public TvIvView(Context context, AttributeSet attrs) {super(context, attrs);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Paint p = new Paint();p.setColor(Color.RED);//文本canvas.drawText("自定义文本", 250, 330, p);Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);//图片canvas.drawBitmap(bitmap, 250, 360, p);}}文字和图片感觉不用多说,图片加载需要一个bitmap,而加载bitmap又需要一个工厂类,就是这样大致的坐标思维截图相信看到这里,一些基础的图案都是可以绘制了。
android 画虚线、实线,画圆角矩形,一半圆角建立dotted_line_gray.xml文件放在drawable文件夹下面。
android:shape="line" 可以修改你想要的形状<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="/apk/res/android"android:shape="line"><!-- 显示一条虚线,破折线的宽度为dashWith,破折线之间的空隙的宽度为dashGap,当dashGap=0dp时,为实线 --><stroke android:width="1dp" android:color="#D5D5D5"android:dashWidth="2dp" android:dashGap="3dp" /><!-- 虚线的高度--><size android:height="2dp" /></shape>然后在布局的xml里面:作为ImageView或者Linearlayout等作为背景源就可以了。
<LinearLayoutandroid:id="@+id/activity_line"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginLeft="5dip"android:layout_marginRight="5dip"android:background="@drawable/dotted_line_gray" />---------2、画圆角矩形建立rect_gray.xml文件放在drawable文件夹下面。
Android圆形控件实现画圆效果本⽂实例为⼤家分享了Android圆形控件实现画圆效果的具体代码,供⼤家参考,具体内容如下实现圆形控件实现如下package com.example.demo.util;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Bitmap;import android.graphics.BitmapShader;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.RectF;import android.graphics.Shader;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.ColorDrawable;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.widget.ImageView;import androidx.annotation.Nullable;import com.example.demo.R;public class CircleImageView extends androidx.appcompat.widget.AppCompatImageView {private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;private static final int COLORDRAWABLE_DIMENSION = 1;private static final int DEFAULT_BORDER_WIDTH = 0;private static final int DEFAULT_BORDER_COLOR = Color.BLACK;private final RectF mDrawableRect = new RectF();private final RectF mBorderRect = new RectF();private final Matrix mShaderMatrix = new Matrix();private final Paint mBitmapPaint = new Paint();private final Paint mBorderPaint = new Paint();private int mBorderColor = DEFAULT_BORDER_COLOR;private int mBorderWidth = DEFAULT_BORDER_WIDTH;private Bitmap mBitmap;private BitmapShader mBitmapShader;private int mBitmapWidth;private int mBitmapHeight;private float mDrawableRadius;private float mBorderRadius;private boolean mReady;private boolean mSetupPending;public CircleImageView(Context context) {super(context);}public CircleImageView(Context context, @Nullable AttributeSet attrs) {this(context,attrs,0);}public CircleImageView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);super.setScaleType(SCALE_TYPE);TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView, defStyle, 0);mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_border_width, DEFAULT_BORDER_WIDTH); mBorderColor = a.getColor(R.styleable.CircleImageView_border_color, DEFAULT_BORDER_COLOR);a.recycle();mReady = true;if (mSetupPending) {setup();mSetupPending = false;}}@Overridepublic ScaleType getScaleType() {return SCALE_TYPE;}@Overridepublic void setScaleType(ScaleType scaleType) {if (scaleType != SCALE_TYPE) {throw new IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType));}}@Overrideprotected void onDraw(Canvas canvas) {if (getDrawable() == null) {return;}canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius, mBitmapPaint);canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius, mBorderPaint);}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);setup();}public int getBorderColor() {return mBorderColor;}public void setBorderColor(int borderColor) {if (borderColor == mBorderColor) {return;}mBorderColor = borderColor;mBorderPaint.setColor(mBorderColor);invalidate();}public int getBorderWidth() {return mBorderWidth;}public void setBorderWidth(int borderWidth) {if (borderWidth == mBorderWidth) {return;}mBorderWidth = borderWidth;setup();}@Overridepublic void setImageBitmap(Bitmap bm) {super.setImageBitmap(bm);mBitmap = bm;setup();}@Overridepublic void setImageDrawable(Drawable drawable) {super.setImageDrawable(drawable);mBitmap = getBitmapFromDrawable(drawable);setup();}@Overridepublic void setImageResource(int resId) {super.setImageResource(resId);mBitmap = getBitmapFromDrawable(getDrawable());setup();}private Bitmap getBitmapFromDrawable(Drawable drawable) {if (drawable == null) {return null;}if (drawable instanceof BitmapDrawable) {return ((BitmapDrawable) drawable).getBitmap();}try {Bitmap bitmap;if (drawable instanceof ColorDrawable) {bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG); } else {bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG);}Canvas canvas = new Canvas(bitmap);drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());drawable.draw(canvas);return bitmap;} catch (OutOfMemoryError e) {return null;}}private void setup() {if (!mReady) {mSetupPending = true;return;}if (mBitmap == null) {return;}mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);mBitmapPaint.setAntiAlias(true);mBitmapPaint.setShader(mBitmapShader);mBorderPaint.setStyle(Paint.Style.STROKE);mBorderPaint.setAntiAlias(true);mBorderPaint.setColor(mBorderColor);mBorderPaint.setStrokeWidth(mBorderWidth);mBitmapHeight = mBitmap.getHeight();mBitmapWidth = mBitmap.getWidth();mBorderRect.set(0, 0, getWidth(), getHeight());mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2, (mBorderRect.width() - mBorderWidth) / 2);mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width() - mBorderWidth, mBorderRect.height() - mBorderWidth);mDrawableRadius = Math.min(mDrawableRect.height() / 2, mDrawableRect.width() / 2);updateShaderMatrix();invalidate();}private void updateShaderMatrix() {float scale;float dx = 0;float dy = 0;mShaderMatrix.set(null);if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width() * mBitmapHeight) {scale = mDrawableRect.height() / (float) mBitmapHeight;dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f;} else {scale = mDrawableRect.width() / (float) mBitmapWidth;dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f;}mShaderMatrix.setScale(scale, scale);mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBorderWidth, (int) (dy + 0.5f) + mBorderWidth); mBitmapShader.setLocalMatrix(mShaderMatrix);}}使⽤如下<com.example.demo.util.CircleImageViewandroid:id="@+id/iv_avatar"android:layout_width="35dp"android:layout_height="35dp"app:border_color="#00000000"android:layout_gravity="center_vertical"android:src="@drawable/ic_launcher_background"></com.example.demo.util.CircleImageView>以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
Android开发使⽤Drawable绘制圆⾓与圆形图案功能⽰例本⽂实例讲述了Android开发使⽤Drawable绘制圆⾓与圆形图案功能。
分享给⼤家供⼤家参考,具体如下:1. 创建类RoundCircleDrawable继承Drawable/*** 圆⾓矩形* @Project App_View* @Package com.android.view.drawable* @author chenlin* @version 1.0* @Date 2016年4⽉21⽇* @Note TODO*/public class RoundCircleDrawable extends Drawable{private Paint mPaint;//画笔private int mWidth;//图⽚宽与长度的最⼩值private int mRadius;//半径private int mRound;//圆⾓private RectF mRectF;//矩形private Bitmap mBitmap;//图⽚private Type mType = Type.TYPE_ROUND;//默认是矩形//设置类型enum Type{TYPE_ROUND, TYPE_CICLE;}public RoundCircleDrawable(Bitmap bitmap){this.mBitmap = bitmap;//初始化画笔mPaint = new Paint();mPaint.setAntiAlias(true);BitmapShader shader = new BitmapShader(mBitmap, TileMode.CLAMP, TileMode.CLAMP);mPaint.setShader(shader);mWidth = Math.min(mBitmap.getWidth(), mBitmap.getHeight());mRadius = mWidth / 2;}/*** 向外提供设置图⽚类型的⽅法* @param type*/public void setType(Type type){this.mType = type;}/*** 暴露给外⾯设置圆⾓的⼤⼩** @param round*/public void setRound(int round) {this.mRound = round;}@Overridepublic void setBounds(int left, int top, int right, int bottom) {super.setBounds(left, top, right, bottom);mRectF = new RectF(left, top, right, bottom);}@Overridepublic void draw(Canvas canvas) {if (mType == Type.TYPE_ROUND) {canvas.drawRoundRect(mRectF, mRound, mRound, mPaint);}else {canvas.drawCircle(mWidth / 2, mWidth / 2, mRadius, mPaint);}}@Overridepublic int getIntrinsicWidth() {if (mType == Type.TYPE_CICLE) {return mWidth;}else {return mBitmap.getWidth();}}@Overridepublic int getIntrinsicHeight() {if (mType == Type.TYPE_CICLE) {return mWidth;}else {return mBitmap.getHeight();}}@Overridepublic void setAlpha(int alpha) {mPaint.setAlpha(alpha);}@Overridepublic void setColorFilter(ColorFilter cf) {mPaint.setColorFilter(cf);}@Overridepublic int getOpacity() {return PixelFormat.TRANSLUCENT;}}2. 实现⽅法public class RoundActivity extends Activity {private ImageView mImageView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_round_drawable);mImageView = (ImageView) findViewById(R.id.iv_round);Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.aa);//RoundImageDrawable drawable = new RoundImageDrawable(bitmap);//drawable.setRound(30);RoundCircleDrawable drawable = new RoundCircleDrawable(bitmap);drawable.setRound(50);mImageView.setImageDrawable(drawable);}}更多关于Android相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》及《》希望本⽂所述对⼤家Android程序设计有所帮助。
android 画虚线、实线,画圆角矩形,一半圆角
建立dotted_line_gray.xml文件放在drawable文件夹下面。
android:shape="line" 可以修改你想要的形状
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="/apk/res/android"
android:shape="line">
<!-- 显示一条虚线,破折线的宽度为dashWith,破折线之间的空隙的宽度为dashGap,当dashGap=0dp时,为实线 -->
<stroke android:width="1dp" android:color="#D5D5D5"
android:dashWidth="2dp" android:dashGap="3dp" />
<!-- 虚线的高度-->
<size android:height="2dp" />
</shape>
然后在布局的xml里面:
作为ImageView或者Linearlayout等作为背景源就可以了。
<LinearLayout
android:id="@+id/activity_line"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:layout_marginRight="5dip"
android:background="@drawable/dotted_line_gray" />
---------
2、画圆角矩形
建立rect_gray.xml文件放在drawable文件夹下面。
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="/apk/res/android"
android:shape="rectangle">
<!-- 填充颜色-->
<solid android:color="#FFFFFF"></solid>
<!-- 线的宽度,颜色灰色-->
<stroke android:width="1dp" android:color="#D5D5D5"></stroke>
<!-- 矩形的圆角半径-->
<corners android:radius="0dp" />
</shape>
然后在布局的xml里面:
作为ImageView或者Linearlayout等作为背景源就可以了。
<LinearLayout
android:id="@+id/activity_myhezu_wantchu zu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/myhezu_d ottedline_rect_green"
android:orientation="horizontal" >
3、一半圆角:
<shape xmlns:android="/apk/res/android"
android:shape="rectangle">
<corners android:topLeftRadius="16dp" <!--上面左圆角的半径--> android:topRightRadius="16dp" <!--上面右圆角的半径-->
android:bottomLeftRadius="0dp" <!--下面左圆角的半径-->
android:bottomRightRadius="0dp"/> <!--下面右圆角的半径-->
<gradient android:startColor="#ffffff"
android:endColor="#ffffff"
android:angle="270"/>
<stroke android:width="1dp"
android:color="#80000000" />
</shape>。