`
阿尔萨斯
  • 浏览: 4171484 次
社区版块
存档分类
最新评论

Android 常用的画图方法

 
阅读更多
package com.sonzer.CanvasDemo;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
/**
 * 绘图常用方法演示
 * @author sonzer
 *
 */
public class CanvasView extends View {
	private Paint mPaint1 = null;
	private Bitmap mBitmap = null;

	public CanvasView(Context context) {
		super(context);
		// 初始化画笔
		mPaint1 = new Paint();
		mPaint1.setColor(Color.RED);// 设置笔刷颜色
		mPaint1.setStrokeWidth(2);// 设置笔刷粗细
		mPaint1.setAntiAlias(true);// 设置抗锯齿
		//初始化图片
		mBitmap = ((BitmapDrawable) getResources().getDrawable(
				R.drawable.sonzer_pic)).getBitmap();
		
		mBitmap = rotate(mBitmap, 10, 0, 0);// 图像旋转
		mBitmap = scale(mBitmap, 0.3f, 0.3f, 0, 0);// 图像缩放
		mBitmap = dispose(mBitmap, mBitmap.getWidth(), mBitmap.getHeight());// 灰度处理
		// 抗锯齿(感觉不明显)
		// canvas.setDrawFilter(new PaintFlagsDrawFilter(0,
		// Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG));
		
		alphaAnimation();//透明度渐变动画
//		translateAnimation();//平移动画
//		scaleAnimation();//缩放动画
//		rotateAnimation();//旋转动画
	}

	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		super.onDraw(canvas);
		canvas.drawColor(Color.WHITE);// 设置画布背景颜色
		canvas.clipRect(0, 0, 320, 480);// 设置画布范围

		canvas.drawLine(20, 20, 100, 30, mPaint1);// 绘制线段
		canvas.drawPoint(60, 50, mPaint1);// 绘制点
		canvas.drawRect(new Rect(20, 70, 120, 100), mPaint1); // 绘制矩形
		canvas.drawRoundRect(new RectF(140, 70, 230, 100), 10, 10, mPaint1); // 绘制圆角矩形
		canvas.drawCircle(50, 140, 30, mPaint1);// 绘制圆形
		canvas.drawArc(new RectF(140, 110, 230, 170), 180, 90, true, mPaint1);// 绘制圆弧
		canvas.drawOval(new RectF(240, 110, 280, 170), mPaint1);// 绘制椭圆形
		canvas.drawText("绘制文字", 20, 200, mPaint1);// 绘制文字
		float[] points = new float[] { 35, 220, 20, 250, 20, 250, 50, 250, 35,
				220, 50, 250 };
		canvas.drawLines(points, mPaint1);// 绘制线段序列,相当3条线,6个坐标

		
		canvas.drawBitmap(mBitmap, 20, 270, null);// 绘制图片

	}

	/**
	 * 图像旋转
	 * 
	 * @param mBitmap
	 * @param angle
	 * @param px
	 * @param py
	 * @return
	 */
	public Bitmap rotate(Bitmap mBitmap, float angle, float px, float py) {
		Matrix matrix = new Matrix();
		matrix.reset();
		matrix.setRotate(angle, px, py);
		mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(),
				mBitmap.getHeight(), matrix, true);
		return mBitmap;
	}

	/**
	 * 图像缩放
	 * 
	 * @param sx
	 * @param sy
	 * @param px
	 * @param py
	 * @return
	 */
	public Bitmap scale(Bitmap mBitmap, float sx, float sy, float px, float py) {
		Matrix matrix = new Matrix();
		matrix.reset();
		matrix.setScale(sx, sy, px, py);
		mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(),
				mBitmap.getHeight(), matrix, true);
		return mBitmap;
	}

	/**
	 * 灰度处理
	 * 
	 * @param mBitmap
	 * @param width
	 * @param height
	 * @return
	 */
	public Bitmap dispose(Bitmap mBitmap, final int width, final int height) {
		int bitmap[] = new int[width * height];
		mBitmap.getPixels(bitmap, 0, width, 0, 0, width, height);
		for (int i = 0; i < height; i++) {
			for (int j = 0; j < width; j++) {
				int index = i * width + j;
				// 获取RGB值
				int r = (bitmap[index] >> 16) & 0xff;
				int g = (bitmap[index] >> 8) & 0xff;
				int b = (bitmap[index]) & 0xff;
				// 计算灰度值
				double gray = r * 0.3 + g * 0.59 + b * 0.11;
				// 0xff000000 | (R << 16) | (G << 8) | B
				bitmap[index] = 0xff000000 | ((int) gray << 16)
						| ((int) gray << 8) | (int) gray;
			}
		}
		Bitmap bm = Bitmap.createBitmap(width, height, Config.ARGB_4444);
		bm.setPixels(bitmap, 0, width, 0, 0, width, height);
		mBitmap = bm;
		bitmap = null;
		return mBitmap;
	}

	/**
	 * 透明度渐变动画
	 */
	public void alphaAnimation() {
		Animation alpha = new AlphaAnimation(0.0f, 1.0f);
		alpha.setDuration(3000);
		this.startAnimation(alpha);
	}

	/**
	 * 平移动画
	 */
	public void translateAnimation() {
		Animation translate = new TranslateAnimation(10, 100, 10, 100);

		translate.setDuration(3000);
		this.startAnimation(translate);
	}

	/**
	 * 缩放动画
	 */
	public void scaleAnimation() {
		Animation scale = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f,
				Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
				0.5f);
		scale.setDuration(3000);
		this.startAnimation(scale);
	}

	/**
	 * 旋转动画
	 */
	public void rotateAnimation() {
		Animation rotate = new RotateAnimation(0.0f, 360.0f,
				Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
				0.5f);
		rotate.setDuration(3000);
		this.startAnimation(rotate);
	}
}

分享到:
评论

相关推荐

    Android 常用画图方法练习

    NULL 博文链接:https://hsx9566.iteye.com/blog/1068872

    android 画图小例子

    android 画图小例子 android 画图小例子 android 画图小例子

    Android绘图常用方法汇总

    Android绘图常用方法有哪些,下面一一为大家列举: 1、有关画笔(Paint)的方法 Paint mPaint= new Paint(); mPaint.setAntiAlias(true); // 消除锯齿 mPaint.setStrokeWidth(mCircleWidth); // 设置圆环的宽度 ...

    Android中Canvas的常用方法总结

    在Android自定义View的时候,我们经常需要绘制一些自己想要的效果。这里就需要使用Canvas对象。下面这篇文章将Canvas对象常用方法做个笔记,方便自己和大家以后使用的时候查阅,下面来一起看看吧。

    Android Canvas方法总结最全面详解API(小结)

    drawXxx方法族:以一定的坐标值在当前画图区域画图,另外图层会叠加, 即后面绘画的图层会覆盖前面绘画的图层。 clipXXX方法族:在当前的画图区域裁剪(clip)出一个新的画图区域,这个 画图区域就是canvas对象的...

    java画图板源码-awesome-androidstudio-plugins:收集Androidstudio常用的插件

    java画图板 源码 收集Android studio 常用的插件 【目录】 【详情】 Exynap Effortless Android Development [官网地址]() android-butterknife-zeleznyandroid-butterknife-zelezny 是根据butterknife定制的一款...

    深入理解Android:卷I--详细书签版

     对于Android应用开发工程师而言,本书中关于Binder,以及sp、wp、Handler和Looper等常用类的分析或许能帮助你迅速适应Android平台上的开发工作。  (2)Android系统开发工程师  Android系统开发工程师常常需要...

    Android入门之画图详解

    前文常用的控件介绍了不少,现在就来讨论一下手机开发中常用到的画图。要掌握Android的画图,首先就要了解一下,基本用到的如下一些图形接口: 1.Bitmap,可以来自资源/文件,也可以在程序中创建,实际上的功能相当...

    Android 自定义view之画图板实现方法

    本文重在对自定义view,以及其常用类,常用方法的初步了解,提供一个思路,效果是其次,画板只是例子,需要的朋友可以参考下

    java_android开发中常用的MD5加密算法 注释超详细

    在andorid或者java中我们主要是使用MD5Utils工具进行加密 默认使用标准加密方式 例如 我们可以在我们要加密的地方 这样做 String password = "123456"; MD5Utils.encode(password); 这里有一个MD5Utils的小加密...

    深入理解Android卷1全

    8.3.4 Surface和画图 / 307 8.3.5 初识Surface小结 / 309 8.4 深入分析Surface / 310 8.4.1 与Surface相关的基础知识介绍 / 310 8.4.2 SurfaceComposerClient分析 / 315 8.4.3 SurfaceControl分析 / 320 8.4.4 ...

    《深入理解Android》卷Ⅰ

    8.3.4 Surface和画图 8.3.5 初识Surface小结 8.4 深入分析Surface 8.4.1 与Surface相关的基础知识介绍 8.4.2 SurfaceComposerClient分析 8.4.3 SurfaceControl分析 8.4.4 writeToParcel和Surface对象的创建 8.4.5 ...

    Android代码-AndroidDrawingView

    绘画板,支持平滑跟随,常用形状,图层变换 Import JitPack Add it in your project's build.gradle at the end of repositories: repositories { // ... maven { url "https://jitpack.io" } } Step 2. Add the ...

    Android摄影图像程序源码

    内含3D相册图片滑动+倾斜+放大+倒影处理,Google官网的图片缓存,PhotoStore图片浏览器,常用图片特效处理,多种统计图表,二维码识别,仿美图秀秀和IOS系统的相机胶卷,画图程序,画图工具, 区域截图, 水果相册...

    ios android 图标

    很多常用的手机图标!小图多,如果要用大图,稍微做下,美图或者画图板都行,PS小郭最好

    安卓画板功能

    安卓画板功能源码,这个源码功能比较简单的,实现了我们常用的画图的功能的,源码比较清晰啊,开发类似的功能的朋友可以学习一下吧。

    安卓版彩绘精灵 ArtRage 1.3.12 Proper 中文多语免费版.zip

    所有这一切都伴随着对三星S-Pen和Android共享系统的表现功能的支持,因此您可以向您的朋友展示您的艺术。 ArtRage 安卓版ArtRage 安卓版 ArtRage 主要特点: 真实世界的绘画工具包括油,水彩,油漆滚筒,铅笔,蜡笔...

Global site tag (gtag.js) - Google Analytics