android中图像绘制

Canvas决定绘制什么, 而paint决定如何绘制      


       Canvas类封装了用作绘图表面的位图;它还提供了draw*方法来实现设计。

       下面的列表提供了对可用的基本图形的简要说明,但并没有深入地探讨每一个draw方法的详细内容:

       drawARGB / drawRGB / drawColor  使用单一的颜色填充画布。
       drawArc  在一个矩形区域的两个角之间绘制一个弧。
       drawBitmap  在画布上绘制一个位图。可以通过指定目标大小或者使用一个矩阵来改变目标位图的外观。
       drawBitmapMesh  使用一个mesh(网)来绘制一个位图,它可以通过移动网中的点来操作目标的外观。
       drawCircle  以给定的点为圆心,绘制一个指定半径的圆。
       drawLine(s)  在两个点之间画一条(多条)直线。
       drawOval  以指定的矩形为边界,画一个椭圆。
       drawPaint  使用指定的Paint填充整个Canvas
       drawPath  绘制指定的Path。Path对象经常用来保存一个对象中基本图形的集合。
       drawPicture  在指定的矩形中绘制一个Picture对象。
       drawPosText  绘制指定了每一个字符的偏移量的文本字符串。
       drawRect  绘制一个矩形。
       drawRoundRect  绘制一个圆角矩形。
       drawText  在Canvas上绘制一个文本串。文本的字体、大小和渲染属性都设置在用来渲染文本的Paint对象中。
       drawTextOnPath  在一个指定的path上绘制文本。

       drawVertices  绘制一系列三角形面片,通过一系列顶点来指定它们。




 Paint类相当于一个笔刷和调色板。它可以选择如何使用上面描述的draw方法来渲染绘制在画布上的基本图形。通过修改Paint对象,可以在绘图的时候控制颜色、样式、字体和特殊效果。最简单地,setColor可以让你选择一个Paint的颜色,而Paint对象的样式(使用setStyle控制)则可以决定是绘制绘图对象的轮廓(STROKE),还是只填充每一部分(FILL),或者是两者都做(STROKE_AND_FILL)


       除了这些简单的控制之外,Paint类还支持透明度,另外,它也可以通过使用各种各样的阴影、过滤器和效果进行修改,从而提供由更丰富的、复杂的画笔和颜料组成的调色板。


       Android SDK包含了一些非常好的实例,它们说明了Paint类中可用的大部分功能。你可以在API demos的graphics子目录中找到它们:      

sdk root folder]\samples\ApiDemos\src\com\android\samples\graphics


设置透明度

Paint paint = new Paint(); 
paint.setAlpha(0x40); //设置透明程度
canvas.drawBitmap(this.bitmap, this.offsetX, this.offsetY,paint);


控制像素

Android--图片像素信息的修改.(透明度,RGB)

一张图片,可以通过getPixels()将所有的像素信息加载到一个int[]中. 所以我们可以通过修改这个数组中的信息从而达到修改图片的目的.


像素点的信息为ARGB.32位.最高8位为透明度信息.所以如果想要修改该透明度就只修改这8为的信息即可.


int[] array; int x, y;


array[x+y*width]=0. 则此像素点位完全透明.


如果是要获得或者判断的话. 通过公式 :(原来的颜色&0x00FFFFFF)|0x透明度000000 即可


例: array[x+y*width] >>> 24 这个取到的就是像素点的透明度信息.


array[x+y*width] = (array[x+y*width] & 0x00FFFFFF ) | 0xAF000000; 则是修改像素点的透明度信息


根据这些就基本可以达到自己想要的效果了. RGB类同.  width是要操作区域的宽.即为getPixels()里填的width信息


修改完毕后就可以通过createBitmap 来创建图像了




2D游戏中绘制背景, 以移动背景来达到移动飞机的目的(注意有一部分飞机移动是要靠飞机自动实现的, 背景移动只是模拟飞机在向前飞)

详细代码(看注释):
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Rect;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
 
public class GameView extends SurfaceView implements SurfaceHolder.Callback,
        Runnable
{
    private SurfaceHolder holder;
    private Canvas canvas;
    private Bitmap background;
    private Bitmap player;
    private boolean isRunning = true;
    private int dy, dy2 = -480;        //用于背景移动
    private Rect srcRect;            //用于放大图片, 和存储图片的位置
    private Rect destRect;
    private Rect destRect2;
    private float playerX, playerY;//飞机的初始位置
 
    public GameView(Context context)
    {
        super(context);
        this.setFocusable(true);
        holder = this.getHolder();//这个this指的是这个Surface
        holder.addCallback(this); //这个this表示实现了Callback接口
        srcRect = new Rect(0, 0, 242, 480);//原始图片大小
        destRect = new Rect(0, dy, 320, 480);//目标屏幕大小. 并带有移动变量dy. 对应图片1 
        destRect2 = new Rect(0, dy2, 320, 0);//屏幕上方的图片,对应图片2
        background = BitmapFactory.decodeResource(getResources(),
                R.drawable.background);
        player = BitmapFactory
                .decodeResource(getResources(), R.drawable.player);
    }
 
    @Override
    public void run()
    {
        while (isRunning)
        {
            drawView();
            try
            {
                Thread.sleep(100);
            } catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }
 
    private void drawView()
    {
        try
        {
            if (holder != null)
            {
                canvas = holder.lockCanvas();
                canvas.drawColor(Color.BLACK);
                //画背景, 并使其移动
                dy += 3;
                dy2 += 3;
                destRect.set(0, dy, 320, 480 + dy);
                destRect2.set(0, dy2, 320, 480 + dy2);
                canvas.drawBitmap(background, srcRect, destRect, null);
                canvas.drawBitmap(background, srcRect, destRect2, null);
                //判断是否到达屏幕底端, 到达了则使其回到屏幕上端
                if (dy >= 480)
                    dy = -480;
                if (dy2 >= 480)
                    dy2 = -480;
                //画飞机
                canvas.drawBitmap(player, playerX, playerY, null);
            }
 
        } catch (Exception e)
        {
            e.printStackTrace();
        } finally
        {
            if (canvas != null)
                holder.unlockCanvasAndPost(canvas);
        }
 
    }
 
    @Override
    public void surfaceCreated(SurfaceHolder holder)
    {
        new Thread(this).start();
        isRunning = true;
        //初始值必须放到这里才行, 因为SurfaceView创建成功后才能获取高宽
        playerX = (this.getWidth() - player.getWidth()) / 2;
        playerY = this.getHeight() - player.getHeight();
    }
 
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height)
    {
 
    }
 
    @Override
    public void surfaceDestroyed(SurfaceHolder holder)
    {
        isRunning = false;
    }
 
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
        if (keyCode == KeyEvent.KEYCODE_BACK)
            isRunning = false;
        return super.onKeyDown(keyCode, event);
    }
 
    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
        playerX = event.getX() - player.getWidth() / 2; //使点击的位置在飞机中央
        playerY = event.getY() - player.getHeight() / 2;
        return super.onTouchEvent(event);
    }
 
}







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值