您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > android开发教程04_1_2D图形接口的使用
2D图形接口的使用韩超@Android经典应用1使用2D图形接口的程序结构2基本绘制3路径(Path)4文本(Text)5位图(Bitmap)1使用2D图形接口的程序结构2D图形的接口实际上是Android图形系统的基础,GUI上的各种可见元素也是基于2D图形接口构建的。因此,AndroidGUI方面的内容分为两层,下层是图形的API,上层是各种控件,各种控件实际上是基于图形API绘制出来的。android.view.View(UI的基础类)MyView(扩展View)::onDraw(Canvascanvas)用户应用程序android.widget.*(控件类)图形接口调用使用控件android.graphics.*(2D图形接口类)通过继承android.view.View类,并实现其中的onDraw()函数来实现绘制的工作,绘制的工作主要右android.graphics包来实现。android.graphics包中的内容是Android系统的2D图形API,其中主要类的内容包含以下一些内容:Point、Rect和Color等:一些基础类,分别定义顶点、矩阵、颜色的基础信息元素;Bitmap:表示内存中的位图,可以从图像文件中建立,可以指定依靠颜色来建立,也可以控制其中的每一个像素;Paint:画笔,用于控制绘制的样式(style)和颜色(color)等信息;Canvas:画布,2D图形系统最核心的一个类,处理onDraw()调用主要绘制的设置和操作在Paint(画笔)和Canvas(画布)2个类当中,使用这两个类就可以完成所有的绘制。在使用2D的图形API方面,步骤通常如下所示:1、扩展实现android.view.View类。2、实现View的OnDraw()函数,在其中使用Canvas的方法进行绘制。使用2D的图形API的场合,自定义实现的View类型作为下层的绘制和上层的GUI系统中间层。事实上,使用Android的2DAPI的程序结构和实现一个自定义控件类似,但是它们的目的略有不同:使用2DAPI主要是为了实现自由的绘制;自定义控件的目的是在应用程序中使用这些控件,包括可以在布局文件中使用甚至使用其属性。2图像、图形、文本的基本绘制主要绘制的设置和操作在Paint(画笔)和Canvas(画布)2个类当中,使用这两个类就可以完成所有的绘制。绘制的几个方面:[*]几何图形(Geometry)[*]文本(Text)[*]位图(Bitmap)voiddrawARGB(inta,intr,intg,intb)//将整体填充为某种颜色voiddrawPoints(float[]pts,Paintpaint)//绘制一个点voiddrawLines(float[]pts,Paintpaint)//绘制一条线voiddrawRect(RectFrect,Paintpaint)//绘制矩形voiddrawCircle(floatcx,floatcy,floatradius,Paintpaint)//绘制圆形voiddrawArc(RectFoval,floatstartAngle,floatsweepAngle,//绘制圆弧booleanuseCenter,Paintpaint)voiddrawText(Stringtext,intstart,intend,floatx,floaty,Paintpaint)voiddrawText(char[]text,intindex,intcount,floatx,floaty,Paintpaint)voiddrawText(Stringtext,floatx,floaty,Paintpaint)voiddrawText(CharSequencetext,intstart,intend,floatx,floaty,Paintpaint)voiddrawBitmap(Bitmapbitmap,Matrixmatrix,Paintpaint)//指定Matrix绘制位图voiddrawBitmap(int[]colors,intoffset,intstride,//指定数组作为Bitmap绘制floatx,floaty,intwidth,intheight,booleanhasAlpha,Paintpaint)voiddrawBitmap(Bitmapbitmap,Rectsrc,RectFdst,Paintpaint)//自动缩放到目标矩形的绘制//颜色方面的设置voidsetARGB(inta,intr,intg,intb)voidsetAlpha(inta)voidsetColor(intcolor)//效果方面的设置voidsetDither(booleandither)ShadersetShader(Shadershader)voidsetStyle(Paint.Stylestyle)//文本相关的设置voidsetTextAlign(Paint.Alignalign)voidsetTextSize(floattextSize)Paint类表示绘制的样式、颜色、效果等信息AlphaBitmap(ApiDemo=Graphics=AlphaBitmap)源代码:android/apis/graphics/AlphaBitmap.javapublicclassAlphaBitmapextendsGraphicsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(newSampleView(this));}privatestaticclassSampleViewextendsView{privateBitmapmBitmap;privateBitmapmBitmap2;privateBitmapmBitmap3;privateShadermShader;privatestaticvoiddrawIntoBitmap(Bitmapbm){floatx=bm.getWidth();floaty=bm.getHeight();Canvasc=newCanvas(bm);Paintp=newPaint();p.setAntiAlias(true);p.setAlpha(0x80);c.drawCircle(x/2,y/2,x/2,p);p.setAlpha(0x30);p.setXfermode(newPorterDuffXfermode(PorterDuff.Mode.SRC));p.setTextSize(60);p.setTextAlign(Paint.Align.CENTER);Paint.FontMetricsfm=p.getFontMetrics();c.drawText(Alpha,x/2,(y-fm.ascent)/2,p);}publicSampleView(Contextcontext){super(context);setFocusable(true);InputStreamis=context.getResources().openRawResource(R.drawable.app_sample_code);mBitmap=BitmapFactory.decodeStream(is);mBitmap2=mBitmap.extractAlpha();mBitmap3=Bitmap.createBitmap(200,200,Bitmap.Config.ALPHA_8);drawIntoBitmap(mBitmap3);mShader=newLinearGradient(0,0,100,70,newint[]{Color.RED,Color.GREEN,Color.BLUE},null,Shader.TileMode.MIRROR);}@OverrideprotectedvoidonDraw(Canvascanvas){canvas.drawColor(Color.WHITE);Paintp=newPaint();floaty=10;p.setColor(Color.RED);canvas.drawBitmap(mBitmap,10,y,p);y+=mBitmap.getHeight()+10;canvas.drawBitmap(mBitmap2,10,y,p);y+=mBitmap2.getHeight()+10;p.setShader(mShader);canvas.drawBitmap(mBitmap3,10,y,p);}}}3路径Path是一个用于表示复杂几何图形的类,这个类主要可以表示几何图形,可以是封闭的图形,也可以是曲线。例如:两点之间或者多点之间的连线,圆弧,矩形,椭圆。voidrMoveTo(floatdx,floatdy)//移动到某点voidrLineTo(floatdx,floatdy)//连线到某点voidaddOval(RectFoval,Path.Directiondir)//增加椭圆voidaddArc(RectFoval,floatstartAngle,floatsweepAngle)//增加圆弧Canvas中的drawPath()函数用于绘制一个Path,具体的绘制效果还要受到Paint参数的影响:voiddrawPath(Pathpath,Paintpaint)Path可以附加路径的效果,这个效果由PathEffects类来表示。PathEffects类具有ComposePathEffect,CornerPathEffect,DashPathEffect,DiscretePathEffect,PathDashPathEffect,SumPathEffect等继承者,其中使用ComposePathEffect可以将效果进行组合。PathEffects是一个给Paint类使用的内容。PathEffectsetPathEffect(PathEffecteffect)参考示例程序:ApiDemo=Graphics=PathFillTypes源代码:android/apis/graphics/PathFillTypes.javaApiDemo=Graphics=PathEffects源代码:android/apis/graphics/PathEffects.javaprivatestaticvoidmakeEffects(PathEffect[]e,floatphase){e[0]=null;//没有效果e[1]=newCornerPathEffect(10);//拐角路径效果e[2]=newDashPathEffect(newfloat[]{10,5,5,5},phase);e[3]=newPathDashPathEffect(makePathDash(),12,phase,PathDashPathEffect.Style.ROTATE);//破折号式效果e[4]=newComposePathEffect(e[2],e[1]);//组合路径效果(内外各不同)e[5]=newComposePathEffect(e[3],e[1]);//组合路径效果}@OverrideprotectedvoidonDraw(Canvascanvas){canvas.drawColor(Color.WHITE);RectFbounds=newRectF();mPath.computeBounds(bounds,false);canvas.translate(10-bounds.left,10-bounds.top);makeEffects(mEffects,mPhase);//创建几种效果mPhase+=1;invalidate();for(inti=0;
本文标题:android开发教程04_1_2D图形接口的使用
链接地址:https://www.777doc.com/doc-3351285 .html