图形与图片的处理
一、
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 kongyeeku@163.com * @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@Overrideprotected void onDraw(Canvas canvas){try{//还要通过反射啊。mCurFrame=-1Field 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参数代表了对目标组件所做的变. */@Overrideprotected 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();}
?
?
?
?