一、
Bitmap想象成一张图片
Bitmap 提供了一些静态方法createBitmap可以源bitmap就行缩放,截取,pathName中解析。
回收自己,与判断是否被回收
BitMapDrawable封装了bitmap
BitmapFactory
二、绘图
步骤1 自定义一个view 继承 View
步骤2 重写onDraw(Canavs)方法 画布
Paint 画笔 。使用画笔在画布上画画
Path 多条直线连接而成的图形
/** * */ package org.crazyit.image; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.LinearGradient; import android.graphics.Paint; import android.graphics.Path; import android.graphics.RectF; import android.graphics.Shader; import android.util.AttributeSet; import android.view.View; /** * Description: * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a> * <br/>Copyright (C), 2001-2012, Yeeku.H.Lee * <br/>This program is protected by copyright laws. * <br/>Program Name: * <br/>Date: * @author Yeeku.H.Lee [email protected] * @version 1.0 */ public class MyView extends View { public MyView(Context context, AttributeSet set) { super(context, set); } @Override // 重写该方法,进行绘图 protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 把整张画布绘制成白色 canvas.drawColor(Color.WHITE); Paint paint = new Paint(); // 去锯齿 // paint.setAntiAlias(true); paint.setColor(Color.BLUE); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(3); // 绘制圆形 canvas.drawCircle(40, 40, 30, paint); // 绘制正方形 canvas.drawRect(10, 80, 70, 140, paint); // 绘制矩形 canvas.drawRect(10, 150, 70, 190, paint); // 绘制圆角矩形 RectF re1 = new RectF(10, 200, 70, 230); canvas.drawRoundRect(re1, 15, 15, paint); // 绘制椭圆 RectF re11 = new RectF(10, 240, 70, 270); canvas.drawOval(re11, paint); // 定义一个Path对象,封闭成一个三角形。 Path path1 = new Path(); path1.moveTo(10, 340); path1.lineTo(70, 340); path1.lineTo(40, 290); path1.close(); // 根据Path进行绘制,绘制三角形 canvas.drawPath(path1, paint); // 定义一个Path对象,封闭成一个五角形。 Path path2 = new Path(); path2.moveTo(26, 360); path2.lineTo(54, 360); path2.lineTo(70, 392); path2.lineTo(40, 420); path2.lineTo(10, 392); path2.close(); // 根据Path进行绘制,绘制五角形 canvas.drawPath(path2, paint); // ----------设置填充风格后绘制---------- paint.setStyle(Paint.Style.FILL); paint.setColor(Color.RED); canvas.drawCircle(120, 40, 30, paint); //绘制正方形 canvas.drawRect(90, 80, 150, 140, paint); //绘制矩形 canvas.drawRect(90, 150, 150, 190, paint); RectF re2 = new RectF(90, 200, 150, 230); //绘制圆角矩形 canvas.drawRoundRect(re2, 15, 15, paint); RectF re21 = new RectF(90, 240, 150, 270); // 绘制椭圆 canvas.drawOval(re21, paint); Path path3 = new Path(); path3.moveTo(90, 340); path3.lineTo(150, 340); path3.lineTo(120, 290); path3.close(); //绘制三角形 canvas.drawPath(path3, paint); Path path4 = new Path(); path4.moveTo(106, 360); path4.lineTo(134, 360); path4.lineTo(150, 392); path4.lineTo(120, 420); path4.lineTo(90, 392); path4.close(); //绘制五角形 canvas.drawPath(path4, paint); // ----------设置渐变器后绘制---------- // 为Paint设置渐变器 Shader mShader = new LinearGradient(0, 0, 40, 60 , new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW } , null , Shader.TileMode.REPEAT); paint.setShader(mShader); //设置阴影 paint.setShadowLayer(45 , 10 , 10 , Color.GRAY); // 绘制圆形 canvas.drawCircle(200, 40, 30, paint); // 绘制正方形 canvas.drawRect(170, 80, 230, 140, paint); // 绘制矩形 canvas.drawRect(170, 150, 230, 190, paint); RectF re3 = new RectF(170, 200, 230, 230); // 绘制圆角矩形 canvas.drawRoundRect(re3, 15, 15, paint); RectF re31 = new RectF(170, 240, 230, 270); // 绘制椭圆 canvas.drawOval(re31, paint); Path path5 = new Path(); path5.moveTo(170, 340); path5.lineTo(230, 340); path5.lineTo(200, 290); path5.close(); // 根据Path进行绘制,绘制三角形 canvas.drawPath(path5, paint); Path path6 = new Path(); path6.moveTo(186, 360); path6.lineTo(214, 360); path6.lineTo(230, 392); path6.lineTo(200, 420); path6.lineTo(170, 392); path6.close(); // 根据Path进行绘制,绘制五角形 canvas.drawPath(path6, paint); // ----------设置字符大小后绘制---------- paint.setTextSize(24); paint.setShader(null); // 绘制7个字符串 canvas.drawText(getResources().getString(R.string.circle), 240, 50, paint); canvas.drawText(getResources().getString(R.string.square), 240, 120, paint); canvas.drawText(getResources().getString(R.string.rect), 240, 175, paint); canvas.drawText(getResources().getString(R.string.round_rect), 230, 220, paint); canvas.drawText(getResources().getString(R.string.oval), 240, 260, paint); canvas.drawText(getResources().getString(R.string.triangle), 240, 325, paint); canvas.drawText(getResources().getString(R.string.pentagon), 240, 390, paint); } }
二、动画资源
1、逐帧动画
ImageView imageView = (ImageView)findViewById(R.id.anim); //获取AnimationDrawable动画对象 final AnimationDrawable anim = (AnimationDrawable)imageView .getBackground();
//开始播放动画 anim.start();
<ImageView android:id="@+id/anim" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@anim/fat_po" android:scaleType="center" />
定义动画XML
<?xml version="1.0" encoding="utf-8"?> <!-- 指定动画循环播放 一直播放oneshot=true表示只播放一次--> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <!-- 添加多个帧 播放持续时间--> <item android:drawable="@drawable/fat_po_f25" android:duration="60" /> <item android:drawable="@drawable/fat_po_f26" android:duration="60" /> <item android:drawable="@drawable/fat_po_f27" android:duration="60" /> </animation-list>
//重写该方法,控制如果动画播放到最后一帧时,隐藏该View @Override protected void onDraw(Canvas canvas) { try { //还要通过反射啊。mCurFrame=-1 Field field = AnimationDrawable.class .getDeclaredField("mCurFrame"); field.setAccessible(true); // 获取anim动画的当前帧 int curFrame = field.getInt(anim); // 如果已经到了最后一帧 curFrame=0表示第一帧 if (curFrame == anim.getNumberOfFrames() - 1) { //让该View隐藏 setVisibility(View.INVISIBLE); } } catch (Exception e) { } super.onDraw(canvas); }
2、补间动画
使用步骤
定义开始和结束的关键帧
Interpolator 有几个子类,加速,减速,匀速。
//加载第一份动画资源 final Animation anim = AnimationUtils .loadAnimation(this, R.anim.anim); //设置动画结束后保留结束状态 anim.setFillAfter(true);
运行动画flower.startAnimation(anim );
自定义补间动画
/* * 该方法的interpolatedTime代表了抽象的动画持续时间,不管动画实际持续时间多长, * interpolatedTime参数总是从0(动画开始时)~1(动画结束时) * Transformation参数代表了对目标组件所做的变. */ @Override protected void applyTransformation(float interpolatedTime, Transformation t) { camera.save(); //根据interpolatedTime时间来控制X、Y、Z上的偏移 camera.translate(100.0f - 100.0f * interpolatedTime , 150.0f * interpolatedTime - 150 , 80.0f - 80.0f * interpolatedTime); // 设置根据interpolatedTime时间在Y柚上旋转不同角度。 camera.rotateY(360 * (interpolatedTime)); // 设置根据interpolatedTime时间在X柚上旋转不同角度 camera.rotateX((360 * interpolatedTime)); //获取Transformation参数的Matrix对象 Matrix matrix = t.getMatrix(); camera.getMatrix(matrix); matrix.preTranslate(-centerX, -centerY); matrix.postTranslate(centerX, centerY); camera.restore(); }
Paint类常用方法:
void setARGB(int a, int r, int g, int b) 设置Paint对象颜色,参数一为alpha透明通道
void setAlpha(int a) 设置alpha不透明度,范围为0~255
void setAntiAlias(boolean aa) //是否抗锯齿
void setColor(int color) //设置颜色,这里Android内部定义的有Color类包含了一些常见颜色定义
void setFakeBoldText(boolean fakeBoldText) //设置伪粗体文本
void setLinearText(boolean linearText) //设置线性文本
PathEffect setPathEffect(PathEffect effect) //设置路径效果
Rasterizer setRasterizer(Rasterizer rasterizer) //设置光栅化
Shader setShader(Shader shader) //设置阴影
void setTextAlign(Paint.Align align) //设置文本对齐
void setTextScaleX(float scaleX) //设置文本缩放倍数,1.0f为原始
void setTextSize(float textSize) //设置字体大小
Typeface setTypeface(Typeface typeface) //设置字体,Typeface包含了字体的类型,粗细,还有倾斜、颜色等。
void setUnderlineText(boolean underlineText) //设置下划线