Canvas决定绘制什么, 而paint决定如何绘制
Canvas类封装了用作绘图表面的位图;它还提供了draw*方法来实现设计。
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); } }