`
zhangfy068
  • 浏览: 143909 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

图形与图片的处理

 
阅读更多

一、

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
		@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)  //设置下划线 

 

  • 大小: 143.4 KB
  • 大小: 95.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics