Android开发者学习笔记_第1页
Android开发者学习笔记_第2页
Android开发者学习笔记_第3页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、开发者学习笔记View&CanvasBitMap、View以及Canvas是我们Ophone程序中常用到的类。本日以feisky的学习笔记呈现,通过实例讲解View&Canvas等等。从资源中获取位图可以使用BitmapDrawable或者BitmapFactory来获取资源中的位图。当然,首先需要获取资源:Resourcesres=getResources();使用BitmapDrawable获取位图使用BitmapDrawable(InputStreamis)构造一个BitmapDrawable;使用BitmapDrawable类的getBitmap()获取得到位图;/读取InputStr

2、eam并得到位图InputStreamis=res.openRawResource(R.drawable.pic180);BitmapDrawablebmpDraw=newBitmapDrawable(is);Bitmapbmp=bmpDraw.getBitmap();或者采用下面的方式:BitmapDrawablebmpDraw=(BitmapDrawable)res.getDrawable(R.drawable.pic180);Bitmapbmp=bmpDraw.getBitmap();使用BitmapFactory获取位图(CreatesBitmapobjectsfromvariouss

3、ources,includingfiles,streams,andbyte-arrays.)使用BitmapFactory类decodeStream(InputStreamis)解码位图资源,获取位图。Bitmapbmp=BitmapFactory.decodeResource(res,R.drawable.pic180);BitmapFactory的所有函数都是static,这个辅助类可以通过资源ID、路径、文件、数据流等方式来获取位图。以上方法在编程的时候可以自由选择,在AndroidSDK中说明可以支持的图片格式如下:png(preferred),jpg(acceptable),gif(

4、discouraged),和bmp(AndroidSDKSupportMediaFormat)。获取位图的信息要获取位图信息,比如位图大小、像素、density、透明度、颜色格式等,获取得到Bitmap就迎刃而解了,这些信息在Bitmap的手册中,这里只是辅助说明以下2点:在Bitmap中对RGB颜色格式使用Bitmap.Config定义,仅包括ALPHA_8、ARGB_4444、ARGB_8888、RGB_565,缺少了一些其他的,比如说RGB_555,在开发中可能需要注意这个小问题;Bitmap还提供了compress()接口来压缩图片,不过AndroidSAK只支持PNG、JPG格式的压

5、缩;其他格式的需要Android开发人员自己补充了。显示位图显示位图可以使用核心类Canvas,通过Canvas类的drawBirmap()显示位图,或者借助于BitmapDrawable来将Bitmap绘制到Canvas。当然,也可以通过BitmapDrawable将位图显示到View中。1. 转换为BitmapDrawable对象显示位图/获取位图Bitmapbmp=BitmapFactory.decodeResource(res,R.drawable.pic180);/转换为BitmapDrawable对象BitmapDrawablebmpDraw=newBitmapDrawable(b

6、mp);/显示位图ImageViewiv2=(ImageView)findViewById(R.id.ImageView02);iv2.setImageDrawable(bmpDraw);使用Canvas类显示位图这儿采用一个继承自View的子类Panel,在子类的OnDraw中显示publicclassMainActivityextendsActivity(/*Calledwhentheactivityisfirstcreated.*/OverridepublicvoidonCreate(BundlesavedInstanceState)(super.onCreate(savedInstan

7、ceState);setContentView(newPanel(this);classPanelextendsView(publicPanel(Contextcontext)(super(context);publicvoidonDraw(Canvascanvas)(Bitmapbmp=BitmapFactory.decodeResource(getResources(),R.drawable.pic180);canvas.drawColor(Color.BLACK);canvas.drawBitmap(bmp,10,10,null);位图缩放将一个位图按照需求重画一遍,画后的位图就是我们需

8、要的了,与位图的显示几乎一样:drawBitmap(Bitmapbitmap,Rectsrc,Rectdst,Paintpaint)。在原有位图的基础上,缩放原位图,创建一个新的位图:CreateBitmap(Bitmapsource,intx,inty,intwidth,intheight,Matrixm,booleanfilter)(1) 借助Canvas的scale(floatsx,floatsy)(Preconcatthecurrentmatrixwiththespecifiedscale.),不过要注意此时整个画布都缩放了。借助MatrixBitmapbmp=BitmapFactor

9、y.decodeResource(getResources(),R.drawable.pic180);Matrixmatrix=newMatrix();matrix.postScale(0.2f,0.2f);Bitmapdstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),bmp.getHeight(),matrix,true);canvas.drawColor(Color.BLACK);canvas.drawBitmap(dstbmp,10,10,null);位图旋转R.drawable.p同样,位图的旋转也可以借助Matrix或者Canvas来

10、实现。Bitmapbmp=BitmapFactory.decodeResource(getResources(),ic180);Matrixmatrix=newMatrix();matrix.postScale(0.8f,0.8f);matrix.postRotate(45);Bitmapdstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),bmp.getHeight(),matrix,true);canvas.drawColor(Color.BLACK);canvas.drawBitmap(dstbmp,10,10,null);旋转效果:3:49

11、AM2. 图片水印的生成方法生成水印的过程。其实分为三个环节:第一,载入原始图片;第二,载入水印图片;第三,保存新的图片。/*createthebitmapfromabytearray*paramsrcthebitmapobjectyouwantproecssparamwatermarkthewatermarkabovethesrcreturnreturnabitmapobject,ifparamterslengthis0,returnnull*/privateBitmapcreateBitmap(Bitmapsrc,Bitmapwatermark)Stringtag=createBitmap

12、;Log.d(tag,createanewbitmap);if(src=null)returnnull;intw=src.getWidth();inth=src.getHeight();intww=watermark.getWidth();intwh=watermark.getHeight();/createthenewblankbitmapBitmapnewb=Bitmap.createBitmap(w,h,Config.ARGB_8888);/创建一个新的和SRC长度宽度一样的位图Canvascv=newCanvas(newb);/drawsrcintocv.drawBitmap(src,

13、0,0,null);/在0,0坐标开始画入src/drawwatermarkintocv.drawBitmap(watermark,w-ww+5,h-wh+5,null);/在src的右下角画入水印/saveallclipcv.save(Canvas.ALL_SAVE_FLAG);/保存/storecv.restore();/存储returnnewb;6.图片水印的生成方法生成水印的过程。其实分为三个环节:第一,载入原始图片;第二,载入水印图片;第三,保存新的图片。/*createthebitmapfromabytearray*paramsrcthebitmapobjectyouwantpro

14、ecssparamwatermarkthewatermarkabovethesrcreturnreturnabitmapobject,ifparamterslengthis0,returnnull*/privateBitmapcreateBitmap(Bitmapsrc,Bitmapwatermark)Stringtag=createBitmap;Log.d(tag,createanewbitmap);if(src=null)returnnull;intw=src.getWidth();inth=src.getHeight();intww=watermark.getWidth();intwh=

15、watermark.getHeight();/createthenewblankbitmapBitmapnewb=Bitmap.createBitmap(w,h,Config.ARGB_8888);/创建一个新的和SRC长度宽度一样的位图Canvascv=newCanvas(newb);/drawsrcintocv.drawBitmap(src,0,0,null);/在0,0坐标开始画入src/drawwatermarkintocv.drawBitmap(watermark,w-ww+5,h-wh+5,null);/在src的右下角画入水印/saveallclipcv.save(Canvas.

16、ALL_SAVE_FLAG);/保存/storecv.restore();/存储returnnewb;Canvas的save和restoreonDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布。在onDraw方法里,我们经常会看到调用save和restore方法,它们到底是干什么用的呢??save:用来保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作。?restore:用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响。save和restore要配对使用(restore可以比save

17、少,但不能多),如果restore调用次数比save多,会引发Error。save和restore之间,往往夹杂的是对Canvas的特殊操作。例如:我们先想在画布上绘制一个右向的三角箭头,当然,我们可以直接绘制,另外,我们也可以先把画布旋转90,画一个向上的箭头,然后再旋转回来(这种旋转操作对于画圆周上的标记非常有用)。然后,我们想在右下角有个20像素的圆,那么,onDraw中的核心代码是:intpx=getMeasuredWidth();intpy=getMeasuredWidth();/Drawbackgroundcanvas.drawRect(0,0,px,py,backgroundPaint);canvas.save();canvas.rotate(90,px/2,py/2);/Drawuparrowcanvas.drawLine(px/2,0,0,py/2,linePaint);canv

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论