安卓之Bitmap ,offset,stride含义

package com.example.bitmapcreate;

import java.io.ByteArrayOutputStream;
import android.util.Log;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(new SampleView(this));
	}
	
	private class SampleView extends View{
		private Bitmap[] mBitmaps;
		private int[] mColors;
		private Paint mPaint;
		
		private static final int WIDTH=200;
		private static final int HEIGHT=150;
		private static final int STRIDE=WIDTH+50;//must be >=WIDTH
		public SampleView(Context context) {
			super(context);
			setFocusable(true);

			mColors = initColorss();
			mBitmaps=new Bitmap[2];
			mPaint=new Paint();
			mPaint.setDither(true);
			
			mBitmaps[0]=Bitmap.createBitmap(mColors, 0, STRIDE, WIDTH, HEIGHT, Config.ARGB_8888);
			mBitmaps[1]=Bitmap.createBitmap(mColors, 250, STRIDE, WIDTH, HEIGHT, Config.ARGB_8888);	
		}
		
		@Override
		protected void onDraw(Canvas canvas) {
			// TODO Auto-generated method stub
			super.onDraw(canvas);
			canvas.drawColor(Color.WHITE);
			for (int i = 0; i < mBitmaps.length; i++) {
				canvas.drawBitmap(mBitmaps[i], 0, 0, null);
				canvas.translate(0, mBitmaps[i].getHeight());
			}
		}
		private int[] initColorss()
		{
			int[] colors = new int[(STRIDE+50)*HEIGHT];
			for(int i=0;i<HEIGHT;i++)
			{
				for(int j=0;j<WIDTH;j++)
				{
					int r = 2*j%255;
					int g = r;
					int b = r;
					int a = 100;
					colors[i*STRIDE+j]=(a<<24)|(r<<16)|(g<<8)|(b);
					for (int k=WIDTH;k<STRIDE+50;k++)
					{
						colors[i*STRIDE+k] = -2578654;
					}
				}
			}
			return colors;
		}
		
	}
}

现在来探讨offset跟stride作用以及相互关系。

在上面的程序中,我们设置位图大小为200*150,设置stride = 200 + 50;设置colors数组大小为(stride+50)*150 = 300*150

这种情况下我们是 colors宽度 > stride宽度 > bitmap宽度

(1)   设置offset = 25,50,100,200,250,300,350,450,500

安卓之Bitmap ,offset,stride含义安卓之Bitmap ,offset,stride含义安卓之Bitmap ,offset,stride含义

                

                   offset =25                                 offset = 50                              offset = 100

安卓之Bitmap ,offset,stride含义安卓之Bitmap ,offset,stride含义安卓之Bitmap ,offset,stride含义


                 offset =200                                 offset = 250  offset = 300

安卓之Bitmap ,offset,stride含义安卓之Bitmap ,offset,stride含义安卓之Bitmap ,offset,stride含义


                       offset =350                              offset = 450                              offset = 500

(2)当colors宽度 = Stride宽度时候

此时就比较蹊跷了,max(offset)= stride – width,

当超过这个max值时候,程序就不能正常启动了。

 

(3)当colors宽度 < stride 宽度时候

程序一样的不能运行。

综上所示,可得:

1:colors 宽度 >= stride  >= bitmap 宽度

2:当colors宽度 = stride时,offset最大值 = stride – 位图width

3:当colors宽度 > stride时,offset可以为任意值,此时位图的实际偏移量=

     Offset%stride,此时的位图就是从offset%stride开始,

     将offset%stride之前的位图区域挪到stride边界的后面。


安卓之Bitmap ,offset,stride含义

上一篇:Android从程序员到架构师之路-高焕堂


下一篇:android listview