admin管理员组

文章数量:1122850

Android动态添加5个图片资,Android绘图实例(Bitmmap,Canvas,Pain的使用)动态的在图片上添加文字(canvas.drawText)...

近些天学习图像处理,今天看见了一段代码中有Bitmap时,找了些Bitmap的资料,有查看了与之有关的绘图类。

BitMap代表一张位图,BitmapDrawable里封装的图片就是一个Bitmap对象,开发者被一个Bitmap对象包装成BitmapDrawable对象,可以调用BitmapDrawable的构造器。

//把一个Bitmap对象包装成BitmapDrawable对象

BitmapDrawable drawable = newBitmapDrawable(bitmap);

如果需要获取BitmapDrawable所包装的Bitmap对象,则可调用BitmapDrawable的getBitmap()方法

//获取一个BitmapDrawable所包装的Bitmap对象

Bitmap bitmap = drawabel.getBitmap();

除此之外,Bitmap还提供一些静态方法来创建新的Bitmap对象,列如如下常用方法。

createBitmap(Bitmap source, int x, int y, int width, int height);从源位图source的指定坐标(给定,x,y)开始,从中“挖取”宽width,高height的一块出来,创新的Bitmap对象。

createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter);对源位图src进行缩放,缩放成宽dstWidth,高dstHeight的位图。

createBitmap(int width, int height, Bitmap.Config config):创建一个宽width,高height的新位图

createBitmap(Bitmap source, int x, int y, int width, int height, Matrizm m, boolean filter):从源位图source的指定坐标点(给定,x,y)开始,从中“挖取”宽width,高height的一块出来,创建新的Bitmap对象。并按Matrix指定的规则进行转化。

自己做了一个宇宙飞船的Demo:通过每次重新绘制图片改变飞行背景,根据飞行高度判读飞行区域,动态添加文字。

效果如:

代码:(没有使用xml布局)

import java.util.Timer;

import java.util.TimerTask;

import android.R.bool;

import android.app.Activity;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.Paint.Align;

import android.graphics.Paint.FontMetrics;

import android.graphics.Typeface;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.util.DisplayMetrics;

import android.view.View;

import android.widget.Toast;

/**

* Matrix ,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放、平移、旋转等操作。

* Matrix的操作,总共分为四种:translate(X,Y)(平移到坐标X,Y),

* rotate(X)(旋转X度),

* scale(缩放)

* skew(倾斜)

* 每一种变换在Android的API里都提供了set, post和pre三种操作方式,除了translate,其他三种操作都可以指定中心点。

* set是直接设置Matrix的值,每次set一次,整个Matrix的数组都会变掉。

* post是后乘,当前的矩阵乘以参数给出的矩阵。可以连续多次使用post,来完成所需的整个变换。

* pre是前乘,参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。

* 坐标中心一半是左上角

* */

public class MoveBack extends Activity {

/**

* DisplayMetrics metrics=getWindowManager().getDefaultDisplay().getMetrics(metrics);

* metrics.widthPixels 屏幕宽

* metrics.heightPixels 屏幕高

* metrics.density 屏幕密度

* */

DisplayMetrics dm;

private int screenWidth;

private int screenHight;

private String text = "宇宙旅行";

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

dm = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(dm);

screenHight = dm.heightPixels;

screenWidth = dm.widthPixels;

setContentView(new MyView(this));

}

//自定义视图

class MyView extends View {

// 记录背景位图的实际高度

int BACK_HEIGHT = 1186;

// 背景图片

private Bitmap back;

private Bitmap plane;

// 背景图片的开始位置

int WIDTH;

int HEIGHT;

//飞机的位置

int fWIDTH;

int fHEIGHT;

private int startY;

public MyView(Context context) {

super(context);

back = BitmapFactory.decodeResource(context.getResources(),

R.drawable.back2);

plane = BitmapFactory.decodeResource(context.getResources(),

R.drawable.plane);

System.out.println(String.valueOf(back.getHeight()) + "TO"

+ String.valueOf(back.getWidth()));

System.out.println(screenHight + "TO" + screenWidth);

BACK_HEIGHT = back.getHeight();

//将图片的大小设置成和屏幕大小一样的

WIDTH = dm.widthPixels;

HEIGHT = dm.heightPixels;

fHEIGHT = plane.getHeight();

fWIDTH = plane.getWidth();

startY = BACK_HEIGHT - HEIGHT;

System.out.println(startY);

final Handler handler = new Handler() {

public void handleMessage(Message msg) {

if (msg.what == 0x123) {

// 重新开始移动

fly(startY, BACK_HEIGHT);

//判断StartY是否在onDraw时大于0

if (startY <= 2) {

startY = BACK_HEIGHT - HEIGHT;

} else {

//用户控制飞行速度

startY -= 3;

}

}

invalidate();

}

};

new Timer().schedule(new TimerTask() {

@Override

public void run() {

handler.sendEmptyMessage(0x123);

}

}, 0, 100);

invalidate();

}

@Override

public void onDraw(Canvas canvas) {

//根据原始位图和Matrix创建新图片

Bitmap bitmap2 = Bitmap

.createBitmap(back, 0, startY, WIDTH, HEIGHT);

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

paint.setTextSize(30);

paint.setStrokeWidth(2);

paint.setColor(Color.CYAN);

//绘制宇宙背景

canvas.drawBitmap(bitmap2, 0, 0, null);

//绘制飞船

canvas.drawBitmap(plane, (float) (WIDTH - fWIDTH) / 2f,

(float) (HEIGHT - fHEIGHT - 50), null);

//在图片上动态的添加文字

canvas.drawText(text, dm.widthPixels/2-text.length()*30/2, dm.heightPixels/2, paint);

}

}

/**

* @param n当前位置

* @param l宇宙长短

* @return 判断出飞船进入那个星系

* */

public void fly(int n, int l){

switch (n/(l/5)) {

case 0:

text = "进入仙女座";

break;

case 1:

text = "进入射手座";

break;

case 2:

text = "进入天蝎座";

break;

case 3:

text = "进入人马座";

break;

case 4:

text = "进入银河系";

break;

default:

break;

}

}

}

本文标签: