• Android ApiDemo分析(九)--Graphics


    Graphics/AlphaBitmap

    这个Demo演示了对图片的一些操作以及基本的绘图方式;

    相关内容:
    在Android要绘制一个东西,需要四个部分:一个Bitmap用于存储像素值,一个Canvas用于定义绘图操作,一个Paint定义绘图使用的颜色,画笔,画刷等属性,最后一个是要绘制的图形本身(如矩形,线段等)。
    1、Bitmap - 称作位图,一般位图的文件格式后缀为bmp,作为一种逐像素的显示对象执行效率高,但是缺点也很明显存储效率低。程序中表示为一种存储对象。
    1)createBitmap (int width, int height, Bitmap.Config config) 
         创建一个Bitmap,设定宽度、高度及存储方式。 Bitmap.Config用于设置位图的存储方式,主要是存储的精度不同。
    2)extractAlpha() 提取Alpha通道,用于返回一个bitmap,该bitmap的alpha值为调用者的alpha值。
    2、Drawable - 作为Android平台下通用的图形对象,它可以装载常用格式的图像,比如GIF、PNG、JPG,当然也支持BMP,当然还提供一些高级的可视化对象,比如渐变、图形等。
    3、Canvas - 名为画布,我们可以看作是一种处理过程,使用各种方法来管理Bitmap、GL或者Path路径,同时它可以配合Matrix矩阵类给图像做旋转、缩放等操作,同时Canvas类还提供了裁剪、选取等操作。
    4、Paint - 我们可以把它看做一个画图工具,比如画笔、画刷。他管理了每个画图工具的字体、颜色、样式。
    1)setAntiAlias()设置是否抗锯齿,即是否对图形边缘做平滑处理;
    5、Shader-着色、渲染,主要用来对图像做颜色上的特殊处理,供Paint使用,mPaint.setShader();
    Shader.TitleMode定义了3种平铺模式。
    1)CLAMP边缘拉伸;2)MIRROR镜像平铺;3)REPEAT重复平铺。
    Shader子类
    1)BitmapShader渲染一张bitmap
         BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY) 
         tileX、tileY分别指定bitmap在X轴、Y轴上的平铺模式。
    2)SweepGradient顺时针圆周扫描(雷达)式渐变,将指定的颜色围绕中心点实现扫描式渐变。
          SweepGradient(float cx, float cy, int[] colors, float[] positions)
          cx,cy指定中心点坐标,colors指定围绕中心点分布的颜色,至少包含两种颜色。positions与colors对应,指定颜色之间的相对分布,起始位置为0,结束位置为1,单调递增,若position为null则平均分布。
         SweepGradient(float cx, float cy, int color0, int color1)只有两种颜色的平均辐射。
    3)RadialGradient放射式渐变
         RadialGradient(float x, float y, float radius, int[] colors, float[] positions, Shader.TileMode tile)
         x、y指定中心,radius指定半径,colors指定分布的颜色,position指定相对位置。
         RadialGradient(float x, float y, float radius, int color0, int color1, Shader.TileMode tile)
         只有两种颜色的渐变。
    4)LinearGradient 线性渐变,将颜色沿一条直线进行渐变
         LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile)
         x0,y0起点坐标,x1、y1终点坐标,其他参数与上面的相同。
         LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile)
          只有两种颜色的渐变。
    5)ComposeShader混合渲染,用于将两种shader混合;
          ComposeShader(Shader shaderA, Shader shaderB, Xfermode mode)
          shader1最下层shader,shader2最上层shader;xfermode叠加模式,如果为null则默认SRC_OVER ;
          ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode)
          指定为PorterDuff.Mode模式的混合。
    6、Xfermode对图形的重叠进行处理
         AvoidXfermode  指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。
         PixelXorXfermode  当覆盖已有的颜色时,应用一个简单的像素XOR操作。
         PorterDuffXfermode  这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互。



    Graphics/AnimateDrawables


    这个Demo演示了自定义的动画Drawable效果,主要实现是在draw()方法中得到当前动画的传输矩阵,之后重新绘图;

    相关内容:
    Android 中定义了一个Drawable类为所有Drawable的抽象基类。表示一个“可以绘制在屏幕的对象”。通常的情况下是从资源文件中读取各种不同类型的Drawable。和View不同的是Drawable不能接受处理事件不能和用户交互。Android系统的Drawable有下列几种类型:
    1)Bitmap: 代表PNG或是JPEG图像。
    2)Nine Patch: PNG图像的一种扩展用法,多用来定义按钮边框,可以缩放。
    3)Shape: 简单的矢量几何图形。
    4)Layers:  drawable 的集合组件,可以由多层Drawable叠加组合而成。
    5)States: drawable 的集合组件,可以从多个Drawable选择其一(一种状态)。
    6)Levels: drawable的集合组件,可以根据Drawable的Level属性选择其一。
    7)Scale: drawable的集合组件,使用一个Drawable但可以根据当前Level缩放Drawable。

    动画的实现

    @Override
    public void draw(Canvas canvas) {
      Drawable dr = getProxy();
      if (dr != null) {
      int sc = canvas.save();
      Animation anim = mAnimation;
      if (anim != null) {
      anim.getTransformation(
      AnimationUtils.currentAnimationTimeMillis(), mTransformation);
      canvas.concat(mTransformation.getMatrix());
    }
      dr.draw(canvas);
      canvas.restoreToCount(sc);
      }
    }

    canvas.save()和canvas.restoreToCount(sc)分别用来保存和恢复Canvas的状态(Maxtrix等属性),因为我们需要修改Canvas的Matrix属性,canvas.concat方法都会和当前Canvas的Matrix进行矩阵运算,如果不保存之前的Matrix属性,每次都会很上次矩阵运算的结果相乘,对应本例,即每次平移的距离会越来越大。

    改编的实例:

    public class AnimateDrawable extends ProxyDrawable {
        
        private Animation mAnimation;
        private Transformation mTransformation = new Transformation();
    
        public AnimateDrawable(Drawable target) {
            super(target);
        }    
        public AnimateDrawable(Drawable target, Animation animation) {
            super(target);
            mAnimation = animation;
        } 
        public Animation getAnimation() {
            return mAnimation;
        }
        
        public void setAnimation(Animation anim) {
            mAnimation = anim;
        }
        public boolean hasStarted() {
            return mAnimation != null && mAnimation.hasStarted();
        }   
        public boolean hasEnded() {
            return mAnimation == null || mAnimation.hasEnded();
        }   
        @Override
        public void draw(Canvas canvas) {
            Drawable dr = getProxy();
            if (dr != null) {
                int sc = canvas.save();
                Animation anim = mAnimation;
               if (anim != null) {
                    anim.getTransformation(
                                        AnimationUtils.currentAnimationTimeMillis(),
                                        mTransformation);
                    canvas.concat(mTransformation.getMatrix());
                }
                dr.draw(canvas);
                canvas.restoreToCount(sc);
            }
        }
    }

    Graphics/Arcs

    这个Demo演示了使用Canvas画矩形、圆形及其相关属性设置;

    相关内容:
    Canvas绘图函数
    drawArc (RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint) 
    1)oval 矩形区域的边界值RectF (float left, float top, float right, float bottom);
    2)startAngle 圆弧起始角度,单位为度。
    3)sweepAngle: 圆弧扫过的角度,顺时针方向,单位为度。
    4)useCenter: 如果为True时,在绘制圆弧时将圆心包括在内,通常用来绘制扇形。
    5)paint: 绘制圆弧的画板属性,如颜色,是否填充等。

    Graphics/BitmapDecode

    这个Demo演示了图像解码的功能实现;

    相关内容:
    Android提供了一个用于图像解码的类BitmapFactory,其中提供了一系列方法解析图片对象,包括byte 数组,InputStream ,资源ID,或者指定的文件名。
    BitmapFactory.Options 用于指定解码时的一些设置:
    1)inBitmap如果设置,当加载内容时该方法将尝试重用这个位图;
    2)inDensity使用像素密度来表示位图;
    3)inDither如果存在抖动,解码器将尝试解码图像抖动;
    4)inPurgeable如果设置为true,则由此产生的位图将分配其像素,以便系统需要回收内存时可以将它们清除;
    5)inInputShareable与inPurgeable一起使用,如果inPurgeable为false那该设置将被忽略,如果为true,那么它可以决定位图是否能够共享一个指向数据源的引用,或者是进行一份拷贝;
    6)inJustDecodeBounds如果设置,那返回的位图将为空,但会保存数据源图像的宽度和高度;
    7)inMutable如果设置,解码方法将始终返回一个可变的位图;
    8)inPreferQualityOverSpeed如果设置为true,解码器将尝试重建图像以获得更高质量的解码,甚至牺牲解码速度;
    9)inPreferredConfig 如果为非空,解码器将尝试解码成这个内部配置;
    10)inSampleSize 如果设置的值大于1,解码器将等比缩放图像以节约内存;
    11)inScaled如果设置,当inDensity和inTargetDensity不为0,加载时该位图将被缩放,以匹配inTargetDensity,而不是依靠图形系统缩放每次将它绘制到画布上;
    12)inScreenDensity当前正在使用的实际屏幕的像素密度;
    13)inTargetDensity这个位图将被画到的目标的像素密度;
    14)mCancel用于指示已经调用了这个对象的取消方法的标志;
    15)outHeight、outWidth图像的高度和宽度;
    16)outMimeType 如果知道,这个字符串将被设置为解码图像的MIME类型

    Graphics/BitmapMesh

    这个Demo演示了图像变化的一种方法,其中包含了对图像的网格化绘制;

    相关内容:
    图像网格化绘制函数
    drawBitmapMesh (Bitmap bitmap, int meshWidth, int meshHeight, float[] verts, int vertOffset, int[] colors, int colorOffset, Paint paint) 
    1)bitmap: 需要绘制在网格上的图像。
    2)meshWidth: 网格的宽度方向的数目(列数),为0时不绘制图像。
    3)meshHeight:网格的高度方向的数目(含数),为0时不绘制图像。
    4)verts: (x,y)对的数组,表示网格顶点的坐标,至少需要有(meshWidth+1) * (meshHeight+1) * 2 + meshOffset  个(x,y)坐标。
    5)vertOffset: verts数组中开始跳过的(x,y)对的数目。
    6)Colors: 可以为空,不为空为每个顶点定义对应的颜色值,至少需要有(meshWidth+1) * (meshHeight+1) * 2 + meshOffset  个(x,y)坐标。
    7)colorOffset: colors数组中开始跳过的(x,y)对的数目。
    8)paint: 可以为空。

    Graphics/Clipping

    这个Demo演示了绘图中区域裁剪的基本用法,通过不同的裁剪选项获得多种绘图效果。Canvas提供了三种裁剪函数:clipPath()、clipRect()、clipRegion()。
     
    相关内容:
    1、Path该类封装了一系列方法,可以绘制线段、矩形、圆弧、椭圆、二次曲线、三次曲线等基本几何图形或是由这些基本几何图形组合;
    Path.Direction绘制方向--CW是顺时针,CCW是逆时针;

    2、Region.Op该枚举类型定义在graphic类中,提供了绘图过程中的剪切方式:
    1)DIFFERENCE,区域相减,差集
    2)REPLACE,完全替换
    3)UNION,区域相加,并集
    4)XOR,异或,选取两个区域没有相交的部分
    5)REVERSE_DIFFERENCE,逆向差集,所选区域减去与前一区域重叠的部分
    6)INTERSECT,交集,重叠部分
     
     
    转 : http://blog.csdn.net/xu_fu/article/details/7340454
  • 相关阅读:
    转(一万小时定律的文章): const 与 readonly区别...
    项目中报错邮件方法
    Windows Phone(一) 正式开发之前的准备资料(主要注册开发者账号,手机解锁,激活码,程序部署)
    转(ASP.NET页面缓存)
    部署XAP时,部署工具提示部署无效,求解决!
    jQuery 1
    DOMform
    jQuery 2 一些常用的函数
    jQuery 6 层次选择器
    jQuery 3 对象转换
  • 原文地址:https://www.cnblogs.com/622698abc/p/3444705.html
Copyright © 2020-2023  润新知