这个demo演示了如何读取并使用一张位图。
* 演示了三种情况:
* 1.使用一张资源中的原始位图
* 2.对原始位图进行修改
* 3.自定义一张位图
public class MainActivity extends Activity {
//定义三张位图
private Bitmap mBitmap;
private Bitmap mBitmap1;
private Bitmap mBitmap2;
private Shader mShader;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new SampleView(this));
}
//创建一个View,用于展示位图
private class SampleView extends View{
public SampleView(Context context) {
super(context);
setFocusable(true);
InputStream is=getResources().openRawResource(R.drawable.ic_launcher);
//获取到原图的可修改复本
mBitmap=BitmapFactory.decodeStream(is);
//只取出mBitmap 的Alpha通道,阿尔法通道是一个8位的灰度通道,该通道用256级灰度来记录图像中的透明度信息
mBitmap1=mBitmap.extractAlpha();
//Bitmap.Config.ALPHA_8 只把像素作为单独的Alpha通道存储,通常是作为其它图像的Mask Bitmap来使用。
//可以理解为创建一个指定大小的空白位图,我们可以在上面绘制内容
mBitmap2=Bitmap.createBitmap(200, 200, Bitmap.Config.ALPHA_8);
drawIntoBitmap(mBitmap2);
//定义一个渲染器(线性渲染器),第一个参数x0表示渐变的起始点x坐标;第二个参数y0表示渐变的起始点y坐标;
//第三个参数x1表示渐变的终点x坐标;第四个参数y1表示渐变的终点y坐标;第五个参数colors表示渐变的颜色数组;
//第六个参数positions用来指定颜色数组的相对位置;第七个参数tile表示平铺方式。
// 通常,参数positions设为null,表示颜色数组以斜坡线的形式均匀分布。
mShader=new LinearGradient(0, 0, 100, 70, new int[]{
Color.RED,Color.GREEN,Color.BLUE
}, null, Shader.TileMode.MIRROR);
}
//重写onDrwa方法绘制图形
@Override
protected void onDraw(Canvas canvas) {
//设置画布的背景
canvas.drawColor(Color.WHITE);
Paint paint=new Paint();
float y=10;
paint.setColor(Color.RED);
//在指定位置绘制图形,使用mBitmap作为参数将绘制源图
canvas.drawBitmap(mBitmap, 10, y, paint);
y+=mBitmap.getHeight()+10;
//绘制一个图形,轮廓为源图的轮廓,颜色为画笔中定义的颜色
canvas.drawBitmap(mBitmap1, 10, y, paint);
y+=mBitmap1.getHeight()+10;
//绘制一个自定义的图形
//设置渲染器
paint.setShader(mShader);
canvas.drawBitmap(mBitmap2, 10, y, paint);
}
}
/**
* 在指定的Bitmap中绘制图形
* @param bm 需要绘制图形的底图
*/
public void drawIntoBitmap(Bitmap bm) {
float x=bm.getWidth();
float y=bm.getHeight();
//定义画布
Canvas c=new Canvas(bm);
//定义画笔
Paint p=new Paint();
p.setAntiAlias(true);
p.setAlpha(0x80);
//画一个圆形,前两个参数表示圆心,第天个参数表示半径
c.drawCircle(x/2, y/2, x/2, p);
p.setAlpha(0x30);
//设置混合模式
p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
//设置议定图形的大小
p.setTextSize(60);
//设置文字图形的排列方式
p.setTextAlign(Paint.Align.CENTER);
//获取字体的大小
Paint.FontMetrics fm=p.getFontMetrics();
//在指定坐点绘制一个文本图形,需要注意的是文本图形的具体位置需要由画笔中设定的排列方式和坐标决定
c.drawText("Alpha", x/2, (y-fm.ascent)/2, p);
}
}