/***设置透明例子部分代码***/ public class TestPicTransparencyView extends SurfaceView implements SurfaceHolder.Callback{ public ManThread thread; //原始图片和透明处理后的图片bmp private Bitmap changed_pic_bmp,src_pic_bmp; //两个图加压到的int数组. private int[] allBmpPixArray; private int[] changedBmpPixArray; //数组的长度,为像素点个数,为图片的长*宽 private int full_pic_int_size=BaseControl.SCREEN_HEIGHT*BaseControl.SCREEN_WIDTH;//屏幕像素 private int min_pic_int_size = 0;//屏幕像素 //透明图片的长和宽 private int small_pic_width; private int small_pic_height; //游戏画面构造器 public TestPicTransparencyView(Context context) { super(context); //设置透明图片大小 small_pic_width = BaseControl.SCREEN_WIDTH/2; small_pic_height = BaseControl.SCREEN_HEIGHT/2; //设置透明图片解压到数组的长度 min_pic_int_size = small_pic_width*small_pic_height; //加载资源 src_pic_bmp=BitmapFactory.decodeResource(getResources(), R.drawable.pic); changed_pic_bmp=BitmapFactory.decodeResource(getResources(), R.drawable.pic); //定义图片解压到的数组大小 allBmpPixArray = new int[full_pic_int_size]; changedBmpPixArray = new int[min_pic_int_size]; //启动绘画线程 SurfaceHolder holder = getHolder(); holder.addCallback(this); thread = new ManThread(holder,context,new Handler()); } //线程绘画图片 class ManThread extends Thread{ private SurfaceHolder mSurfaceHolder; public ManThread(SurfaceHolder sh,Context context,Handler ha) { mSurfaceHolder = sh; //将前景图的像素信息解压到数组allBmpPixArray中 src_pic_bmp.getPixels(allBmpPixArray, 0, BaseControl.SCREEN_WIDTH, 0, 0, BaseControl.SCREEN_WIDTH, BaseControl.SCREEN_HEIGHT); changed_pic_bmp.getPixels(changedBmpPixArray, 0, small_pic_width, 0, 0, small_pic_width, small_pic_height); //将小图进行透明处理 dealTransparency(); } public void run(){ Canvas c = null; c = mSurfaceHolder.lockCanvas(null); synchronized (mSurfaceHolder) { src_pic_bmp = Bitmap.createBitmap(allBmpPixArray, BaseControl.SCREEN_WIDTH, BaseControl.SCREEN_HEIGHT, Config.ARGB_8888); //重新用修改像素后的 数组构建图片 changed_pic_bmp= Bitmap.createBitmap(changedBmpPixArray, small_pic_width, small_pic_height, Config.ARGB_8888); c.drawBitmap(src_pic_bmp, 0, 0, null); c.drawBitmap(changed_pic_bmp, small_pic_width, small_pic_height, null); } if (c != null) { mSurfaceHolder.unlockCanvasAndPost(c);// 释放对serface的编辑 } } } //将小图进行透明处理,每调用一次透明度减半 public void dealTransparency(){ for(int i= 0 ;i< small_pic_width;i++){ for(int j= 0 ;j< small_pic_height;j++){ for (int z=31;z>=24;z--) /** * 第一次调用 当Z=31时,1左移31位,高位颜色透明值为1和原图的透明度值1& = 1 ,进入if *重复调用时会根据当前透明度选择左移位数值 */ if ( ( (1<<z)& changedBmpPixArray[i+j*small_pic_width])!=0) { /** * * 说明: * RGB类型的像素的24-31位保存的是透明度信息, * 当值为255时代表不透明 * 当值为0时代表完全透明 * 0-23位保存颜色信息 * * (1<<z)左移31位,值为127,原图片不透明,透明值为255 * 重复调用的话每减一次透明度折半 */ changedBmpPixArray[i+j*small_pic_width]-=(1<<z); break; } } } } @Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } @Override public void surfaceCreated(SurfaceHolder holder) { thread.start(); } public void surfaceDestroyed(SurfaceHolder holder) { try { thread.join(); } catch (InterruptedException e) { } } }