Android UI开发(五)Bitmap和Canvas实例
- 格式:doc
- 大小:28.00 KB
- 文档页数:2
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的绘图和动画功能进行应用开发,并且结合实例进行详细讲解。
绘图功能是Android开发中非常重要的一环,它可以帮助我们创建各种各样的图形,包括线条、图像、文本等。
首先,我们需要了解Android绘图的基本概念和原理。
在Android中,绘图是通过Canvas和Paint类来实现的。
Canvas类提供了绘制图形的方法,而Paint类则定义了图形的颜色和样式。
在Android应用中,绘制图形的方法有很多,比如使用Path绘制自定义的图形,使用Bitmap绘制位图,使用ShapeDrawable绘制形状等。
接下来,我们将以绘制一个简单的圆形为例,来介绍如何使用Canvas和Paint类进行绘图。
首先,我们需要在布局文件中定义一个View来显示绘制的图形。
在XML文件中添加如下代码:```<LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><android:id="@+id/myView"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>```然后,在Java文件中创建一个自定义的View类MyView,并且重写onDraw方法,在该方法内进行绘图操作。
具体代码如下:```public class MyView extends View {private Paint mPaint;public MyView(Context context) {super(context);initPaint();}public MyView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);initPaint();public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initPaint();}private void initPaint() {mPaint = new Paint();();();}@Overrideprotected void onDraw(Canvas canvas) {(canvas);float centerX = getWidth() / 2;float centerY = getHeight() / 2;float radius = (centerX, centerY);(centerX, centerY, radius, mPaint);}```这样,一个简单的圆形就绘制出来了。
/cmdn/bbs/viewthread.php?tid=18736&page=1 #pid89255Android UI开发专题(一) 之界面设计近期很多网友对Android用户界面的设计表示很感兴趣,对于Android UI开发自绘控件和游戏制作而言掌握好绘图基础是必不可少的。
本次专题分10节来讲述,有关OpenGL ES相关的可能将放到以后再透露。
本次主要涉及以下四个包的相关内容:android.content.res 资源类android.graphics 底层图形类android.view 显示类android.widget 控件类一、android.content.res.Resources对于Android平台的资源类android.content.res.Resources可能很多网友比较陌生,一起来看看SDK上是怎么介绍的吧,Contains classes for accessing application resources, such as raw asset files, colors, drawables, media or other other files in the package, plus important device configuration details (orientation, input types, etc.) that affect how the application may behave.平时用到的二进制源文件raw、颜色colors、图形drawables和多媒体文件media的相关资源均通过该类来管理。
int getColor(int id) 对应res/values/colors.xmlDrawable getDrawable(int id) 对应res/drawable/XmlResourceParser getLayout(int id) 对应res/layout/String getString(int id) 和CharSequence getText(int id) 对应res/values/strings.xmlInputStream openRawResource(int id) 对应res/raw/void parseBundleExtra (String tagName, AttributeSet attrs, Bundle outBundle) 对应res/xml/ String[] getStringArray(int id) res/values/arrays.xmlfloat getDimension(int id) res/values/dimens.xml二、android.graphics.Bitmap作为位图操作类,Bitmap提供了很多实用的方法,常用的我们总结如下:boolean compress(pressFormat format, int quality, OutputStream stream) 压缩一个Bitmap对象根据相关的编码、画质保存到一个OutputStream中。
Android学习之BitMap⽤法实例下⾯简单说明了BitMap的⽤法:从服务器下载⼀张图⽚,显⽰在ImageView控件上,并将该图⽚保存在移动设备的SD上。
1// 根据⽹络URL获取输⼊流2public InputStream getUrlInputStream(String strUrl) throws IOException {3 URL url = new URL(strUrl);4 HttpURLConnection conn = (HttpURLConnection) url.openConnection();5 InputStream inputStream = conn.getInputStream();6if (inputStream != null) {7return inputStream;8 } else {9 Log.i("inputStream", "输⼊流对象为空");10return null;11 }12 }1314// 将输⼊流转化为Bitmap流15public Bitmap getBitmap(InputStream inputStream) {16 Bitmap bitmap = null;17if (inputStream != null) {18 bitmap = BitmapFactory.decodeStream(inputStream);19return bitmap;20 } else {21 Log.i("test", "输⼊流对象in为空");22return null;23 }24 }2526// 给ImageView对象赋值27public void setWidgetImage(Bitmap bitmap) {28 ImageView img = new ImageView(this);29if (bitmap != null) {30 img.setImageBitmap(bitmap);31 }32 }3334// 获取SD卡上的⽂件存储路径35public void createSDFile() {36 File sdroot = Environment.getExternalStorageDirectory();37 File file = new File(sdroot + "/Android/date/包名/⽂件名");38if (Environment.MEDIA_MOUNTED.equals(Environment39 .getExternalStorageState())) {40// 相关操作41 }42 }4344// 将图⽚保存到SD卡上45public boolean readToSDCard(File file, Bitmap bitmap)46throws FileNotFoundException {47 FileOutputStream os = new FileOutputStream(file);48return press(pressFormat.PNG, 90, os);49// true:表⽰操作成功,false:表⽰操作失败50 }。
Andorid绘图Canvas做Java的都知道,绘图肯定首先需要一个Canvas,然后在用Graphics在上面绘制自己想要图案。
不错,Android 上面也类似,你可以从一个Bitmap得到它的Canvas(new Canvas(BitMap bitMap)),进行绘制,也可以自定义一个View,用它的Canvas。
不同的是,Android里没有Graphics,而用 Paint代之,当然用法也稍有不同。
以下是自定义View的一段代码:Java代码1.Java代码1.@Override2.publicvoidonDraw(Canvascanvas){3.//首先定义一个paint4.Paintpaint=newPaint();5.6.//绘制矩形区域-实心矩形7.//设置颜色8.paint.setColor(Color.WHITE);9.//设置样式-填充10.paint.setStyle(Style.FILL);11.//绘制一个矩形12.canvas.drawRect(newRect(0,0,getWidth(),getHeight()),paint);13.14.//绘空心矩形15.//设置颜色16.paint.setColor(Color.RED);17.//设置样式-空心矩形18.paint.setStyle(Style.STROKE);19.//绘制一个矩形20.canvas.drawRect(newRect(10,10,50,20),paint);21.22.//绘文字23.//设置颜色24.paint.setColor(Color.GREEN);25.//绘文字26.canvas.drawText(str,30,30,paint);27.28.//绘图29.//从资源文件中生成位图30.Bitmapbitmap=BitmapFactory.decodeResource(getResources(),R.drawable.icon);31.//绘图32.canvas.drawBitmap(bitmap,10,10,paint);33.}34.35.@Override36.publicvoidonDraw(Canvascanvas){37.//首先定义一个paint38.Paintpaint=newPaint();39.40.//绘制矩形区域-实心矩形41.//设置颜色42.paint.setColor(Color.WHITE);43.//设置样式-填充44.paint.setStyle(Style.FILL);45.//绘制一个矩形46.canvas.drawRect(newRect(0,0,getWidth(),getHeight()),paint);47.48.//绘空心矩形49.//设置颜色50.paint.setColor(Color.RED);51.//设置样式-空心矩形52.paint.setStyle(Style.STROKE);53.//绘制一个矩形54.canvas.drawRect(newRect(10,10,50,20),paint);55.56.//绘文字57.//设置颜色58.paint.setColor(Color.GREEN);59.//绘文字60.canvas.drawText(str,30,30,paint);61.62.//绘图63.//从资源文件中生成位图64.Bitmapbitmap=BitmapFactory.decodeResource(getResources(),R.drawable.icon);65.//绘图66.canvas.drawBitmap(bitmap,10,10,paint);67.}以上需要注意的有三点:1、Android中的Rect和java中的可能稍有区别,前两个参数是左上角的坐标,后两个参数是右下角的坐标(不是宽度和高度);2、Style.STROKE和Style.FILL外边的像素数是有区别的,这点和java里一样;3、绘文字时,设置的坐标点为(30,30),但绘出来后你会发现,文字的左上角坐标要比你设置的偏上,不知道是android设置的bug,还是我们有理解到坐标点的意义。
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都是提供⼀个矩形局域。
AndroidCanvas和Bitmap结合绘图详解流程⽬录Rect/RectFMatrixCanvasBitmapRect/RectF存储四个值的矩形类:左侧、顶部、右侧和底部。
可⽤于直接在画布上绘制或仅⽤于存储要绘制的对象的⼤⼩。
Rect和RectF 类之间的区别在于 RectF 存储浮点值,⽽Rect类存储整数。
private static Bitmap createDrawableBitmap(Drawable drawable) {int width = drawable.getIntrinsicWidth();int height = drawable.getIntrinsicHeight();if (width <= 0 || height <= 0) {return null;}float scale = Math.min(1.0f, ((float) MAX_IMAGE_SIZE) / ((float) (width * height)));if ((drawable instanceof BitmapDrawable) && scale == 1.0f) {return ((BitmapDrawable) drawable).getBitmap();}int bitmapWidth = (int) (((float) width) * scale);int bitmapHeight = (int) (((float) height) * scale);Bitmap bitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);Rect existingBounds = drawable.getBounds();int left = existingBounds.left;int top = existingBounds.top;int right = existingBounds.right;int bottom = existingBounds.bottom;drawable.setBounds(0, 0, bitmapWidth, bitmapHeight);drawable.draw(canvas);drawable.setBounds(left, top, right, bottom);return bitmap;}Matrix⼀个3 x 3的矩阵,⽤于存储可⽤于转换画布的信息。
AndroidcanvasdrawBitmap⽅法详解及实例Android canvas drawBitmap⽅法详解及实例之前⾃⼰在⾃定义view,⽤到canvas.drawBitmap(Bitmap, SrcRect, DesRect, Paint)的时候,对其中的第2和3个参数的含义含糊不清。
看源码函数也没理解,然后看了⼀些其他的博客加上⾃⼰的理解,整理如下。
⾸先,我们看⼀张图⽚,今天就要绘制这张图⽚。
然后将图⽚⽤红⾊的线条分成4个部分,如下:我们⾃定义⼀个View,代码如下:public class PoterDuffLoadingView extends View {private Resources mResources;private Paint mBitPaint;private Bitmap mBitmap;private int mTotalWidth, mTotalHeight;private Bitmap girlBitmap;private int girlBitWidth , girlBitHeight;private Rect girlSrcRect , girlDesRect;public PoterDuffLoadingView(Context context) {super(context);mResources = getResources();initBitmap();}private void initBitmap() {//美⼥图⽚的宽和⾼girlBitmap = ((BitmapDrawable)mResources.getDrawable(R.drawable.a1)).getBitmap();girlBitWidth = girlBitmap.getWidth();girlBitHeight = girlBitmap.getHeight();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawBitmap(girlBitmap, girlSrcRect, girlDesRect, null);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {Log.d("xxxxxx", "onSizeChanged , w = "+w+" , h = "+h+" , mBitWidth = "+mBitWidth+" , mBitHeight = "+mBitHeight);super.onSizeChanged(w, h, oldw, oldh);mTotalWidth = w;mTotalHeight = h;girlSrcRect = new Rect(0, 0, girlBitWidth, girlBitHeight);girlDesRect = new Rect(0, 0, girlBitWidth, girlBitHeight);}}其中:girlSrcRect = new Rect(0, 0, girlBitWidth, girlBitHeight);表⽰要画的图就是整个图⽚的⼤⼩。
Android实现画板功能(⼆)本⽂实例为⼤家分享了Android实现画板功能的具体代码,讲解使⽤imageView,bitmap的⽅式实现画板功能,供⼤家参考,具体内容如下前⾔在上⼀篇⽂章中我介绍过⽤⾃定义view的⽅式实现画板功能,在这篇⽂章中继续讲解使⽤imageView,bitmap的⽅式实现画板功能。
也是⾮常简单,初始化canvas,paint,创建和imageView⼀样⼤的bitmap,当⼿指点击屏幕时记录下初始位置,⼿指移动时传递当前位置,调⽤canvas的draw Line⽅法就可以实现画图的效果了。
如果想要保存画出来的图⽚,把bitmap保存下来即可。
效果图既然开发出了画板,那就随便画⼀点吧(画图我已经尽⼒了)。
布局⽂件<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="55dp"android:background="@color/teal_200"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="我的画板"android:layout_marginStart="10dp"android:layout_centerVertical="true"android:textColor="@android:color/white"android:textSize="16sp"/><TextViewandroid:id="@+id/text_clear"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="清除"android:layout_alignParentEnd="true"android:layout_marginEnd="10dp"android:layout_centerVertical="true"android:textColor="@android:color/white" android:textSize="16sp"/><TextViewandroid:id="@+id/text_eraser"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="擦除"android:layout_toStartOf="@id/text_clear" android:layout_marginEnd="10dp"android:layout_centerVertical="true"android:textColor="@android:color/white" android:textSize="16sp"/><TextViewandroid:id="@+id/text_blue"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="蓝⾊"android:layout_toStartOf="@id/text_eraser" android:layout_marginEnd="10dp"android:layout_centerVertical="true"android:textColor="@android:color/white" android:textSize="16sp"/><TextViewandroid:id="@+id/text_red"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="红⾊"android:layout_toStartOf="@id/text_blue" android:layout_marginEnd="10dp"android:layout_centerVertical="true"android:textColor="@android:color/white" android:textSize="16sp"/></RelativeLayout><ImageViewandroid:id="@+id/image"android:layout_marginTop="55dp"android:layout_width="match_parent"android:layout_height="match_parent"></ImageView></RelativeLayout>DrawLineViewimport android.annotation.SuppressLintimport android.graphics.*import android.view.MotionEventimport android.widget.ImageViewclass DrawLineView (view: ImageView){private var defaultPaint: Paintprivate var canvas: Canvasprivate var bitmap: Bitmapprivate var imageView:ImageViewprivate var startX = 0fprivate var startY = 0finit {imageView = viewbitmap = Bitmap.createBitmap(imageView.width, imageView.height, Bitmap.Config.ARGB_8888)canvas = Canvas(bitmap)canvas.drawColor(Color.WHITE)defaultPaint = Paint(Paint.ANTI_ALIAS_FLAG or Paint.DITHER_FLAG)defaultPaint.style = Paint.Style.STROKEdefaultPaint.strokeWidth = 5fdefaultPaint.color = Color.REDcanvas.drawBitmap(bitmap, Matrix(), defaultPaint)imageView.setImageBitmap(bitmap)eventHandler()}@SuppressLint("ClickableViewAccessibility")private fun eventHandler() {imageView.setOnTouchListener { _, event ->when (event.action) {MotionEvent.ACTION_DOWN -> {startX = event.xstartY = event.y}MotionEvent.ACTION_MOVE -> {val endX = event.xval endY = event.ycanvas.drawLine(startX, startY, endX, endY, defaultPaint)startX = event.xstartY = event.yimageView.setImageBitmap(bitmap)}MotionEvent.ACTION_UP -> {}}true}}fun clear(){bitmap.eraseColor(Color.WHITE)imageView.setImageBitmap(bitmap)}fun blue(){defaultPaint.color = Color.BLUE}fun red(){defaultPaint.color = Color.RED}fun eraser(){defaultPaint.color = Color.WHITE}}这是我⾃⼰封装的DrawLineView类,在init⽅法中初始化bitmap和canvas,传进来的bitmap的宽⾼就是imageView的宽⾼。
androidcanvas的drawBitmap1、基本的绘制图⽚⽅法//Bitmap:图⽚对象,left:偏移左边的位置,top:偏移顶部的位置drawBitmap(Bitmap bitmap, float left, float top, Paint paint)2、对图⽚剪接和限定显⽰区域第⼀个Rect 代表要绘制的bitmap 区域,第⼆个 Rect 代表的是要将bitmap 绘制在屏幕的什么地⽅drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint);Rect src: 是对图⽚进⾏裁截,若是空null则显⽰整个图⽚RectF dst:是图⽚在Canvas画布中显⽰的区域,⼤于src则把src的裁截区放⼤,⼩于src则把src的裁截区缩⼩。
此时我先定义两个Rect,mSrcRect 取值为整个Bitmap 区域,mDestRect 取值为view左上⽅和bitmap同样⼤⼩;[html]1. private Rect mSrcRect, mDestRect;[html]1. mSrcRect = new Rect(0, 0, mBitWidth, mBitHeight);2. mDestRect = new Rect(0, 0, mBitWidth, mBitHeight);在onDraw ⾥绘制该位图:[html]1. canvas.drawBitmap(mBitmap, mSrcRect, mDestRect, mBitPaint);画在左上⽅似乎缺乏美感,我们把美⼥画在view的中⼼,没错,我们只需要改变mDestRect:[html]1. // 计算左边位置2. int left = mHalfWidth - mBitWidth / 2;3. // 计算上边位置4. int top = mHalfHeight - mBitHeight / 2;5. mDestRect = new Rect(left, top, left + mBitWidth, top + mBitHeight);位置计算的时候,只需要注意在android屏幕坐标系⾥,左上⾓的位置是(0,0),往右往下为正,此时效果如下:。
Andriod绘制图形android.graphics包是核心渲染包,它提供了一些初级图形工具,诸如画布、颜色过滤器、画笔等,可以让你直接在屏幕上进行图像处理。
这个包中提供了很多类,下面我们就看一下这个包中主要的几个类。
一、Canvas类android.graphics.CanvasCanvas类好比手机中的画纸,我们可以在Canvas上画图形或者图像。
一般我们用android来绘画的时候,需要四个组成部分:1、位图:包含像素2、Canvas画板:包含绘画内容,写入位图3、初始图形:如Rect、Bitmap、text等4、Paint:用来描述上面初始图形的颜色和类型等Canvas类提供了三个构造方法:Public Canvas();构造一个默认无参的Canvas对象Public Canvas(Bitmap bitmap);根据一个Bitmap构造一个Canvas对象Public Canvas(GL gl);根据一个GL来构造一个对象下面我们来了解一下Canvas类提供的方法:在Canvas类提供的方法中比较多经常用的是以draw开头的方法,draw开头的方法很容易理解就是向画板中画图形,比如可以向Canvas中画位图,给图形填充颜色等。
比如方法:drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)画弧形drawCircle(float cx, float cy, float radius, Paint paint)画圆形Canvas类提供的方法比较多,在此我们不一一赘述,在后面的内容中,我将给大家举几个实际的应用程序例子来演示Canvas类的使用方法。
二、Paint类android.graphics.PaintPaint类包含有用来画几何图形、文本、位图的类型和颜色等信息,如果把Canvas类看作是画板,那我们可以把Paint类看做是画笔,可以根据需要画出不同颜色和样式的图形、文本等内容。
android的绘图原理Android的绘图原理是通过使用Canvas类来进行绘图操作。
Canvas是一个绘图的画布,提供了一系列的绘制方法,如绘制直线、绘制圆形、绘制矩形等等。
在进行绘图操作时,可以通过获取Canvas的实例,并使用其提供的绘制方法来画出所需的图形。
绘图的过程是按照顺序执行的。
首先需要创建一个空的Bitmap对象,然后将其传递给Canvas的构造函数,这样就可以在该Bitmap上进行绘制操作。
然后,通过调用Canvas的绘制方法,将所需的图形绘制到Bitmap上。
在绘图时,需要注意的是,绘图操作是以像素为单位的。
所以在绘制图形之前,需要先将要绘制的图形转化为一系列的像素点。
然后,在绘制时,会根据这些像素点的位置和颜色来在Bitmap上进行像素点的绘制。
绘制完成后,就可以将Bitmap显示在屏幕上或保存为文件。
在Android中,绘图的过程是通过调用View的onDraw()方法来完成的。
当View需要进行绘制时,系统会自动调用该方法,并将一个Canvas对象传递给该方法。
在onDraw()方法中,可以通过获取Canvas的实例,并使用其提供的绘制方法来实现具体的绘图操作。
除了使用Canvas类进行绘图外,还可以通过使用Paint类来设置绘图的一些属性,如颜色、线条宽度等等。
通过设置Paint的属性,可以实现更加丰富的绘图效果。
总之,Android的绘图原理是通过使用Canvas类来进行绘制操作。
通过获取Canvas的实例,并使用其提供的绘制方法来画出所需的图形。
同时,可以通过使用Paint类来设置绘图的一些属性,实现更加丰富的绘图效果。
Android开发实现各种图形绘制功能⽰例本⽂实例讲述了Android开发实现各种图形绘制功能。
分享给⼤家供⼤家参考,具体如下:这⾥结合本⼈的开发事例,简单介绍⼀下如何在Android平台下实现各种图形的绘制。
⾸先⾃定义⼀个View类,这个view类⾥⾯需要⼀个Paint对象来控制图形的属性,需要⼀个Path对象来记录图形绘制的路径,需要⼀个Canvas类来执⾏绘图操作,还需要⼀个Bitmap类来盛放绘画的结果。
Paint mPaint = new Paint();mPaint.setAntiAlias(true);mPaint.setColor(0xFFFF0000);mPaint.setStyle(Paint.Style.STROKE);mPaint.setStrokeWidth(12);以上代码初始化了Paint对象,设置了画笔的颜⾊、类型和粗细。
BitmapmForeBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);CanvasmCanvas = new Canvas(mForeBitmap);PathmPath = new Path();以上代码创建了⼀个Bitmap对象,并将他作为参数传给了Canvas对象,同时初始化Path对象。
想让View响应⽤户的触摸事件,需要实现View类的onTouchEvent函数,代码如下:@Overridepublic boolean onTouchEvent(MotionEvent event) {float x = event.getX();float y = event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:touch_start(x, y);invalidate();break;case MotionEvent.ACTION_MOVE:touch_move(x, y);invalidate();break;case MotionEvent.ACTION_UP:touch_up();invalidate();break;}return true;}其中touch_start,touch_move和touch_up函数分别处理按下,移动和抬起事件,函数的实现将在后⾯介绍,invalidate函数会调⽤onDraw函数保证绘图效果实时显⽰出来。
开发者学习笔记——View&CanvasBitMap、View以及Canvas是我们Ophone程序中常用到的类。
本日以feisky的学习笔记呈现,通过实例讲解View&Canva s等等。
1. 从资源中获取位图可以使用BitmapDrawable或者BitmapFactory来获取资源中的位图。
当然,首先需要获取资源:Resources res=getResources();使用BitmapDrawable获取位图使用BitmapDrawable (InputStream is)构造一个BitmapDrawable;使用BitmapDrawable类的getBitmap()获取得到位图;// 读取InputStream并得到位图InputStream is=res.openRawResource(R.drawable.pic180); BitmapDrawable bmpDraw=new BitmapDrawable(is);Bitmap bmp=bmpDraw.getBitmap();或者采用下面的方式:BitmapDrawablebmpDraw=(BitmapDrawable)res.getDrawable(R.drawable.pic1 80);Bitmap bmp=bmpDraw.getBitmap();使用BitmapFactory获取位图(Creates Bitmap objects from various sources, including files, streams, and byte-arrays.)使用BitmapFactory类decodeStream(InputStream is)解码位图资源,获取位图。
Bitmap bmp=BitmapFactory.decodeResource(res,R.drawable.pic180);BitmapFactory的所有函数都是static,这个辅助类可以通过资源ID、路径、文件、数据流等方式来获取位图。
canvas优秀案例Canvas是HTML5中的一个标签,可以用于绘制图形、动画、游戏等。
它提供了丰富的API,可以实现各种复杂的效果。
下面是一些优秀的Canvas案例,展示了Canvas的强大功能和创造力。
1. 粒子效果:这个案例使用Canvas绘制了许多小球,它们在屏幕上随机运动,并且会发生碰撞和反弹。
这种粒子效果可以用于创建炫酷的背景或特效。
2. 时钟动画:这个案例使用Canvas绘制了一个时钟,指针会根据当前时间进行旋转。
通过改变指针的颜色、形状和动画效果,可以创建出各种不同风格的时钟。
3. 3D效果:Canvas可以实现3D效果,可以用于创建立体的图形和场景。
这个案例展示了一个旋转的立方体,通过改变视角和投影矩阵,可以实现各种复杂的3D效果。
4. 碰撞检测:Canvas可以检测两个物体是否发生碰撞,这个案例展示了一个简单的碰撞检测游戏。
玩家需要控制一个小球,避开障碍物并收集道具,通过碰撞检测判断游戏是否结束。
5. 图片处理:Canvas可以对图片进行处理,包括缩放、旋转、裁剪等操作。
这个案例展示了一个简单的图片编辑器,用户可以通过拖动滑块来改变图片的亮度、对比度和饱和度。
6. 轨迹动画:Canvas可以绘制路径,并在路径上运动。
这个案例展示了一个小球在预先定义的路径上运动,通过改变路径的形状和曲线,可以创建出各种复杂的轨迹动画。
7. 粒子轨迹:这个案例使用Canvas绘制了许多小球,它们在屏幕上随机运动,并且会留下轨迹。
通过改变小球的颜色和大小,可以创建出各种炫酷的粒子轨迹效果。
8. 游戏开发:Canvas可以用于创建各种类型的游戏,包括平台游戏、射击游戏、益智游戏等。
这个案例展示了一个简单的打砖块游戏,玩家需要控制一个板子来接住小球并打破砖块。
9. 数据可视化:Canvas可以用于可视化数据,包括绘制图表、地图等。
这个案例展示了一个简单的柱状图,通过改变数据和颜色,可以创建出各种不同类型的图表。
android绘制和屏幕刷新机制原理Android绘制和屏幕刷新机制原理Android绘制和屏幕刷新机制是整个Android系统中非常关键的一部分,是实现Android视觉效果的重要手段。
本文将对Android绘制和屏幕刷新机制原理进行介绍。
一、Android绘制机制1.1 概念Android的绘制机制是指视图控件的生成和绘制细节处理的过程,它能够将模拟器或真机中的数据以视觉形式呈现出来。
Android的绘图工作比较复杂,但是也非常灵活,开发者可以自由选择使用Canvas、OpenGL ES等方式实现自己的绘图需求。
1.2 核心类(1) View:是Android系统的基本控件,也是视图绘制的出发点,提供UI的布局和绘制。
(2) Canvas:是绘图的逻辑处理类,提供画布和绘制各种图形、文字等的方法。
(3) Paint:是画笔类,提供各种绘图属性,比如颜色、字体大小等。
(4) Bitmap:是Android的位图类,它是绘图中一个重要的载体。
1.3 绘制流程Android绘制流程如下:(1) View根据XML文件或者代码逻辑创建。
(2) View的onMeasure()函数根据View的宽度和高度测量View 的大小。
(3) View的onLayout()根据其父容器的LayoutParams设定View 的大小和位置。
(4) View的onDraw()函数根据Canvas的绘制规则将View绘制出来。
(5) View的onTouchEvent()可以处理用户触摸事件。
1.4 常见绘制技术(1) Canvas:Canvas是Android的基础绘制核心,通过Canvas 的API,我们可以非常容易地实现一些基本绘图操作。
(2) OpenGL ES:OpenGL ES是一种高性能的三维图形绘制API,相比传统的二维绘图API更加强大。
(3) SurfaceView:SurfaceView是一个比较特殊的控件,可以在UI线程之外绘制UI界面,能够达到Android界面流畅的效果。
Android开发应用Bitmap效果处理我们都已经常用Matrix这个类来处理图片,然而此篇文章,笔者将以Bitmap的像素为单位处理图片,实现包括切图,底片,马赛克等特效。
首先我们来看这个方法:public void getPixels(int[] pixels, int offset, intstride,int x, int y, int width, int height);这里我们可以获取到一个bitmap的对应的像素集合,它在pixels这个int数组里,因为在这里pixels是一个一维数组,而它表示的是一个二维的位图,因此把它转变成二维数组操作起来方便一些,于是使用如下代码:for (int i = 0; i <pixels.length; i++) {pixelss[i/bitmap.getWidth()][i%bitmap.getWidth()]=pixels[i];}现在,我们操作一个位图,就可以方便的来使用横纵坐标了,那么,我们应该如何对图片进行裁剪呢?这种功能在图片编辑的软件中很常见。
让我们看看下面这个方法:private Bitmap cutBitmap(Bitmap bitmap,intleft,inttop,intright,int bottom){ int [] pixels=new int [bitmap.getWidth()*bitmap.getHeight()];int [][] pixelss=new int[bitmap.getHeight()][bitmap.getWidth()];int [] retpixels=new int [(bottom-top)*(right-left)];bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());for (int i = 0; i <pixels.length; i++) {pixelss[i/bitmap.getWidth()][i%bitmap.getWidth()]=pixels[i];}int k=0;for (int i = 0; i <pixelss.length; i++) {for (int j = 0; j <pixelss[i].length; j++) {if(i<=bottom&&i>top&&j<=right&&j>left){retpixels[k]=pixelss[i][j];k++;}}}Bitmap ret=Bitmap.createBitmap(right-left, bottom-top,Config.ARGB_8888);ret.setPixels(retpixels, 0, (right-left), 0, 0, right-left, bottom-top);return ret;}我们使用这个方法就可以对图片进行裁剪了;原图片:运行后的截图:事实上我们可以使用类似的方式实现增添马赛克的效果://参数说明://bitmap是被打马赛克的图片,//left,top,right,bottom是被打马赛克的区域,//configSize是马赛克的质量,configSize越大越模糊。
本文章来给大家介绍Android中Bitmap和Drawable用法详解,有需要了解的同学可进入参考。
一、相关概念1、Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable),我们根据画图的需求,创建相应的可画对象2、Canvas画布,绘图的目的区域,用于绘图3、Bitmap位图,用于图的处理4、Matrix矩阵二、Bitmap1、从资源中获取BitmapResources res = getResources();Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.icon);2、Bitmap → byte[]代码如下public byte[] Bitmap2Bytes(Bitmap bm) {ByteArrayOutputStream baos = new ByteArrayOutputStream();Bitmap bmp = ()press(pressFormat.PNG, 100, baos);return baos.toByteArray();}3、byte[] → Bitmap代码如下public Bitmap Bytes2Bimap(byte[] b) {if (b.length != 0) {return BitmapFactory.decodeByteArray(b, 0, b.length);} else {return null;}}Bitmap缩放代码如下public static Bitmap zoomBitmap(Bitmap bitmap, int width, int height) {int w = bitmap.getWidth();int h = bitmap.getHeight();Matrix matrix = new Matrix();float scaleWidth = ((float) width / w);float scaleHeight = ((float) height / h);matrix.postScale(scaleWidth, scaleHeight);Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true); return newbmp;}5、将Drawable转化为Bitmap代码如下public static Bitmap drawableToBitmap(Drawable drawable) {// 取 drawable 的长宽int w = drawable.getIntrinsicWidth();int h = drawable.getIntrinsicHeight();// 取 drawable 的颜色格式Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888: Bitmap.Config.RGB_565;// 建立对应 bitmapBitmap bitmap = Bitmap.createBitmap(w, h, config);// 建立对应 bitmap 的画布Canvas canvas = new Canvas(bitmap);drawable.setBounds(0, 0, w, h);// 把 drawable 内容画到画布中drawable.draw(canvas);return bitmap;}public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) { int w = bitmap.getWidth();int h = bitmap.getHeight();Bitmap output = Bitmap.createBitmap(w, h, Config.ARGB_8888);Canvas canvas = new Canvas(output);final int color = 0xff424242;final Paint paint = new Paint();final Rect rect = new Rect(0, 0, w, h);final RectF rectF = new RectF(rect);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);return output;}6、获得圆角图片代码如下public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) {final int reflectionGap = 4;int w = bitmap.getWidth();int h = bitmap.getHeight();Matrix matrix = new Matrix();matrix.preScale(1, -1);Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, h / 2, w, h / 2, matrix, false);Bitmap bitmapWithReflection = Bitmap.createBitmap(w, (h + h / 2), Config.ARGB_8888);Canvas canvas = new Canvas(bitmapWithReflection);canvas.drawBitmap(bitmap, 0, 0, null);Paint deafalutPaint = new Paint();canvas.drawRect(0, h, w, h + reflectionGap, deafalutPaint);canvas.drawBitmap(reflectionImage, 0, h + reflectionGap, null);Paint paint = new Paint();LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0, bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff,0x00ffffff, TileMode.CLAMP);paint.setShader(shader);// Set the Transfer mode to be porter duff and destination inpaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));// Draw a rectangle using the paint with our linear gradientcanvas.drawRect(0, h, w, bitmapWithReflection.getHeight()+ reflectionGap, paint);return bitmapWithReflection;}三、Drawable代码如下Bitmap bm=xxx; //xxx根据你的情况获取BitmapDrawable bd= new BitmapDrawable(getResource(), bm);因为BtimapDrawable是Drawable的子类,最终直接使用bd对象即可。
在Android UI开发专题的前五节我们讲到的东西主要是基础和理论内容,从本次
Android123将通过实例代码来演示,本次主要是Bitmap和Canvas类的使用,根据要求缩放Bitmap对象并返回新的Bitmap对象。
centerToFit方法一共有4个参数,返回一个Bitmap 类型,第一个参数为原始的位图对象,width和height分别为新的宽和高,而Context是用来加载资源的上下文实例。
1Bitmap centerToFit(Bitmap bitmap,int width,int height, Context context) {
2
3final int bitmapWidth=bitmap.getWidth();//获取原始bitmap的宽度
4
5final int bitmapHeight=bitmap.getHeight();
6
7if(bitmapWidth<width || bitmapHeight<height) {
8
9int color=context.getResources().getColor(R.color.window_background);//从资源读取背景色
10
11Bitmap centered=Bitmap.createBitmap(bitmapWidth<width ? width : bitmap Width,
12
13bitmapHeight<height ? height : bitmapHeight, Bitmap.Config.RGB_565);
14
15centered.setDensity(bitmap.getDensity());
16
17Canvas canvas=new Canvas(centered);
18
19canvas.drawColor(color);//先绘制背景色
20
21canvas.drawBitmap(bitmap, (width-bitmapWidth)/2.0f, (height-bitmapHei ght)/2.0f,null);//通过Canvas绘制Bitmap
22
23bitmap=centered;
24
25}
26
27return bitmap;//返回新的bitmap
28
29}
30
31
本段代码从Android 2.1开始将会应用在全新的Home主屏上,同时相关的ImageView 的适应屏幕大小的setScaleType(fitCenter) 方法类似,仅仅是我们制定了未来的大小。