Android图片处理


一个在平板(800x600)上运行的图片处理项目,项目效果图如下:


一进来查询系统所有图片在gallery里列出,此段代码参考系统的图片查看。主要是启动一个线程去访问contentprovider,详细可看项目代码

ContentObserver mDbObserver;

mDbObserver = new ContentObserver(mHandler) {
			public void onChange(boolean selfChange) {
				rebake(false,
						Constanst.isMediaScannerScanning(getContentResolver()));
			}
		};

private void rebake(boolean unmounted, boolean scanning) {
		if (unmounted == mUnmounted && scanning == mScanning) {
			return;
		}
		abortWorker();
		mUnmounted = unmounted;
		mScanning = scanning;
		if (mUnmounted) {
		} else {
			startWorker();
		}
	}
主要是startWorker()代码,里面就是查询代码。

对图片的操作有5种:

全屏

public void fullscreen() {
		Drawable able = showimage.getDrawable();
		BitmapDrawable bd = (BitmapDrawable) able;
		Bitmap bitmap = bd.getBitmap();
		fullscreen.setImageBitmap(bitmap);
		fullscreen.setVisibility(View.VISIBLE);
	}
这是对View的一个操作,做一个全屏的ImageView不显示出来,当点击全屏按钮或者双击图片才显示出来达到全屏效果。

放大

public void large() {
		Drawable able = showimage.getDrawable();
		BitmapDrawable bd = (BitmapDrawable) able;
		Bitmap bitmap = bd.getBitmap();
		int bmpWidth = bitmap.getWidth();
		int bmpHeight = bitmap.getHeight();
		double scale = 1.25;
		float scaleWidth = 1;
		float scaleHeight = 1;
		scaleWidth = (float) (scaleWidth * scale);
		scaleHeight = (float) (scaleHeight * scale);
		if (bmpWidth * scaleWidth > screenWidth
				|| bmpHeight * scaleHeight > screenHeight) {
			Toast.makeText(getBaseContext(),getResources().getString(R.string.not_more_large), Toast.LENGTH_SHORT)
					.show();
			return;
		}
		Matrix matrix = new Matrix();
		matrix.postScale(scaleWidth, scaleHeight);
		Bitmap resizeBmp = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth,
				bmpHeight, matrix, true);
		showimage.setImageBitmap(resizeBmp);
	}
scale为放大比例(自定义),主要注意超出屏幕大小就不能放大了,否则会报错。

缩小

public void small() {
		Drawable able = showimage.getDrawable();
		BitmapDrawable bd = (BitmapDrawable) able;
		Bitmap bitmap = bd.getBitmap();
		int bmpWidth = bitmap.getWidth();
		int bmpHeight = bitmap.getHeight();
		double scale = 0.75;
		float scaleWidth = 1;
		float scaleHeight = 1;
		scaleWidth = (float) (scaleWidth * scale);
		scaleHeight = (float) (scaleHeight * scale);
		if (bmpWidth * scaleWidth < 10 || bmpHeight * scaleHeight < 10) {
			Toast.makeText(getBaseContext(), getResources().getString(R.string.not_more_small), Toast.LENGTH_SHORT)
					.show();
			return;
		}
		Matrix matrix = new Matrix();
		matrix.postScale(scaleWidth, scaleHeight);
		Bitmap resizeBmp = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth,
				bmpHeight, matrix, true);
		showimage.setImageBitmap(resizeBmp);
	}
旋转(向左或者向右)

public void rotate(int value) {
		Drawable able = showimage.getDrawable();
		BitmapDrawable bd = (BitmapDrawable) able;
		Bitmap bitmap = bd.getBitmap();
		int bmpWidth = bitmap.getWidth();
		int bmpHeight = bitmap.getHeight();
		if (bmpWidth < showimage.getWidth()
				&& bmpHeight < showimage.getHeight()) {
			int newwidth = bitmap.getHeight();
			int newheight = bitmap.getWidth();
			float scaleWidth = ((float) newwidth) / bmpWidth;
			float scaleHeight = ((float) newheight) / bmpHeight;
			Matrix matrix = new Matrix();
			matrix.postScale(scaleWidth, scaleHeight);
			matrix.postRotate(value);
			Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth,
					bmpHeight, matrix, true);
			showimage.setImageBitmap(resizedBitmap);
		} else {
			int newwidth = showimage.getWidth();
			int newheight = showimage.getHeight();
			float scaleWidth = ((float) newwidth) / bmpWidth;
			float scaleHeight = ((float) newheight) / bmpHeight;
			Matrix matrix = new Matrix();
			matrix.postScale(scaleWidth, scaleHeight);
			matrix.postRotate(value);
			Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth,
					bmpHeight, matrix, true);
			showimage.setImageBitmap(resizedBitmap);
		}
	}
传进-90是向右旋转,90向左旋转。

下面贴出主界面的全部代码,需要的类查看项目代码。

package com.jht.browse;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.database.ContentObserver;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.media.ThumbnailUtils;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.os.StatFs;
import android.provider.MediaStore;
import android.util.Log;
import android.view.Display;
import android.view.GestureDetector;
import android.view.KeyEvent;
import android.view.GestureDetector.OnDoubleTapListener;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.Toast;

public class BrowseImageActivity extends Activity implements OnGestureListener {
	ImageButton fullscreebtn;
	ImageButton largebtn;
	ImageButton reducebtn;
	ImageButton arightbtn;
	ImageButton aleftbtn;

	Editor editor;
	ArrayList<IImage> imagelist;
	long timer = 2000;
	Button gridBackBtn;
	Button maincancleBtn;
	ContentObserver mDbObserver;
	Thread mWorkerThread;
	GridView gridview;
	GridView gridimage;
	boolean mScanning;
	boolean mUnmounted;
	IImageList nowImagelist;
	IImage nowImage;
	Handler mHandler = new Handler() {
		public void handleMessage(Message msg) {
			fullscreen.setImageURI(imagelist.get(msg.what).fullSizeImageUri());
		};
	};
	ImagesAdapter mAdapter;
	Dialog mMediaScanningDialog;
	ImageView showimage;
	ImageView fullscreen;
	int screenWidth;
	int screenHeight;
	GestureDetector detector;
	int index = 0;
	int count = 0;
	long firClick = 0;
	long secClick = 0;
	ArrayList<IImageList> mAllLists = new ArrayList<IImageList>();

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);
		setContentView(R.layout.main);
		initUI();
		initRadioGroup();
	}

	private void initRadioGroup() {
		SharedPreferences preference = getSharedPreferences(
				Constanst.SharedName, MODE_PRIVATE);
		editor = preference.edit();
		RadioGroup playstylegroup = (RadioGroup) this
				.findViewById(R.id.playstyle_group);
		RadioGroup ordergroup = (RadioGroup) this
				.findViewById(R.id.order_group);
		RadioGroup playtimegroup = (RadioGroup) this
				.findViewById(R.id.playtime_group);
		playstylegroup
				.setOnCheckedChangeListener(new OnCheckedChangeListener() {
					public void onCheckedChanged(RadioGroup group, int checkedId) {
						switch (checkedId) {
						case R.id.playall:
							editor.putString(Constanst.SlidePlayStyle,
									Constanst.PlayAll);
							editor.commit();
							break;
						case R.id.playone:
							editor.putString(Constanst.SlidePlayStyle,
									Constanst.PlayOne);
							editor.commit();
							break;
						}
					}
				});
		ordergroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {
			public void onCheckedChanged(RadioGroup group, int checkedId) {
				switch (checkedId) {
				case R.id.playorder:
					editor.putString(Constanst.SlidePlayOrder,
							Constanst.PlayOrder);
					editor.commit();
					break;
				case R.id.playrandom:
					editor.putString(Constanst.SlidePlayOrder,
							Constanst.PlayRandom);
					editor.commit();
					break;
				}

			}
		});
		playtimegroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {
			public void onCheckedChanged(RadioGroup group, int checkedId) {
				switch (checkedId) {
				case R.id.playtwosecond:
					editor.putString(Constanst.SlidePlayTime,
							Constanst.PlayTwoSecond);
					editor.commit();
					break;
				case R.id.playthreesecond:
					editor.putString(Constanst.SlidePlayTime,
							Constanst.PlayThreeSecond);
					editor.commit();
					break;
				case R.id.playfoursecond:
					editor.putString(Constanst.SlidePlayTime,
							Constanst.PlayFourSecond);
					editor.commit();
					break;
				}
			}
		});
	}

	private void initUI() {
		LinearLayout imgsetLL = (LinearLayout) findViewById(R.id.imgsetTL);
		imgsetLL.getBackground().setAlpha(100);
		Display display = getWindowManager().getDefaultDisplay();
		maincancleBtn = (Button) findViewById(R.id.cancle_btn);
		gridBackBtn = (Button) findViewById(R.id.gridviewbtn);
		detector = new GestureDetector(this);
		screenWidth = display.getWidth();
		screenHeight = display.getHeight();
		fullscreen = (ImageView) findViewById(R.id.fullscreenimg);
		showimage = (ImageView) findViewById(R.id.imageshow);
		fullscreebtn = (ImageButton) findViewById(R.id.fullscreen_btn);
		largebtn = (ImageButton) findViewById(R.id.large_btn);
		reducebtn = (ImageButton) findViewById(R.id.reduce_btn);
		arightbtn = (ImageButton) findViewById(R.id.aright_btn);
		aleftbtn = (ImageButton) findViewById(R.id.aleft_btn);
		gridview = (GridView) findViewById(R.id.GridView);
		gridimage = (GridView) findViewById(R.id.GridImage);
		maincancleBtn.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				BrowseImageActivity.this.finish();
			}
		});
		gridBackBtn.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				if (gridview.getVisibility() != View.VISIBLE) {
					gridview.setVisibility(View.VISIBLE);
				}
				if (gridimage.getVisibility() != View.GONE) {
					gridimage.setVisibility(View.GONE);
				}
			}
		});
		fullscreebtn.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				playSlide();
			}
		});
		largebtn.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				large();
			}
		});
		reducebtn.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				small();
			}
		});
		arightbtn.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				rotate(-90);
			}
		});
		aleftbtn.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				rotate(90);
			}
		});
		mDbObserver = new ContentObserver(mHandler) {
			public void onChange(boolean selfChange) {
				rebake(false,
						Constanst.isMediaScannerScanning(getContentResolver()));
			}
		};
		gridview.setOnItemClickListener(new OnItemClickListener() {
			public void onItemClick(AdapterView<?> adapter, View arg1,
					int position, long arg3) {
				Item item = mAdapter.mItems.get(position);
				IImageList imagelist = item.getImageList();
				nowImagelist = imagelist;
				NewAdapter newadapter = new NewAdapter(getLayoutInflater(),
						imagelist);
				gridview.setVisibility(View.GONE);
				gridimage.setAdapter(newadapter);
				gridimage.setVisibility(View.VISIBLE);
			}
		});
		gridimage.setOnItemClickListener(new OnItemClickListener() {
			public void onItemClick(AdapterView<?> adapter, View arg1,
					int position, long arg3) {
				NewAdapter newadapter = (NewAdapter) adapter.getAdapter();
				newadapter.setSeclection(position);
				newadapter.updateDisplay();
				IImage image = (IImage) newadapter.getItem(position);
				index = nowImagelist.getImageIndex(image);
				nowImage = image;
				showimage.setImageURI(image.fullSizeImageUri());
			}
		});
		showimage.setOnTouchListener(new OnTouchListener() {
			public boolean onTouch(View v, MotionEvent event) {
				if (MotionEvent.ACTION_DOWN == event.getAction()) {
					count++;
					if (count == 1) {
						firClick = System.currentTimeMillis();
					} else if (count == 2) {
						secClick = System.currentTimeMillis();
						if (secClick - firClick < 1000) {
							fullscreen();
						}
						count = 0;
						firClick = 0;
						secClick = 0;
					}
				}
				return true;
			}
		});
		detector.setOnDoubleTapListener(new OnDoubleTapListener() {
			public boolean onSingleTapConfirmed(MotionEvent e) {
				return false;
			}

			public boolean onDoubleTapEvent(MotionEvent e) {
				if (fullscreen.getVisibility() == View.VISIBLE) {
					fullscreen.setVisibility(View.GONE);
				}
				mHandler.removeCallbacks(mRunnable);
				mHandler.removeCallbacks(randomRunnable);
				return false;
			}

			public boolean onDoubleTap(MotionEvent e) {

				return false;
			}
		});
		initGridView();
	}

	Runnable mRunnable = new Runnable() {
		@Override
		public void run() {
			Message msg = mHandler.obtainMessage();
			index++;
			if (index == imagelist.size()) {
				index = 0;
			}
			msg.what = index;
			mHandler.sendMessage(msg);
			mHandler.postDelayed(mRunnable, timer);
		}
	};
	Runnable randomRunnable = new Runnable() {
		@Override
		public void run() {
			Message msg = mHandler.obtainMessage();
			index = (int) Math.round(Math.random() * 10);
			msg.what = index;
			mHandler.sendMessage(msg);
			mHandler.postDelayed(randomRunnable, timer);
		}
	};

	private void playSlide() {
		fullscreen();
		SharedPreferences preference = getSharedPreferences(
				Constanst.SharedName, MODE_PRIVATE);
		String slideplaystyle = preference.getString(Constanst.SlidePlayStyle,
				"");
		String slideplayorder = preference.getString(Constanst.SlidePlayOrder,
				"");
		String slideplaytime = preference.getString(Constanst.SlidePlayTime,
				Constanst.PlayTwoSecond);
		if (slideplaystyle.equals(Constanst.PlayAll)) {
			imagelist = getAllImage();
			fullscreensetimage(slideplayorder, slideplaytime);
		}
		if (slideplaystyle.equals(Constanst.PlayOne)) {
			imagelist = getImage();
			fullscreensetimage(slideplayorder, slideplaytime);
		}
	}

	private void fullscreensetimage(String slideplayorder, String slideplaytime) {
		if (slideplayorder.equals(Constanst.PlayOrder)) {
			index = imagelist.indexOf(nowImage);
			if (slideplaytime.equals(Constanst.PlayFourSecond)) {
				timer = 4000;
				mHandler.postDelayed(mRunnable, timer);
			} else if (slideplaytime.equals(Constanst.PlayThreeSecond)) {
				timer = 3000;
				mHandler.postDelayed(mRunnable, timer);
			} else {
				timer = 2000;
				mHandler.postDelayed(mRunnable, timer);
			}
		} else if (slideplayorder.equals(Constanst.PlayRandom)) {
			if (slideplaytime.equals(Constanst.PlayFourSecond)) {
				timer = 4000;
				mHandler.postDelayed(randomRunnable, timer);
			} else if (slideplaytime.equals(Constanst.PlayThreeSecond)) {
				timer = 3000;
				mHandler.postDelayed(randomRunnable, timer);
			} else {
				timer = 2000;
				mHandler.postDelayed(randomRunnable, timer);
			}
		}
	}

	private ArrayList<IImage> getImage() {
		ArrayList<IImage> imageList = new ArrayList<IImage>();
		for (int i = 0; i < nowImagelist.getCount(); i++) {
			IImage image = nowImagelist.getImageAt(i);
			imageList.add(image);
		}
		return imageList;
	}

	private ArrayList<IImage> getAllImage() {
		ArrayList<IImage> imageList = new ArrayList<IImage>();
		for (IImageList list : mAllLists) {
			for (int i = 0; i < list.getCount(); i++) {
				IImage image = list.getImageAt(i);
				imageList.add(image);
			}
		}
		return imageList;
	}

	private void initGridView() {
		mAdapter = new ImagesAdapter(getLayoutInflater());
		gridview.setAdapter(mAdapter);
		getContentResolver()
				.registerContentObserver(
						MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true,
						mDbObserver);
		mUnmounted = false;
		mScanning = false;
		startWorker();
	}

	public void fullscreen() {
		Drawable able = showimage.getDrawable();
		BitmapDrawable bd = (BitmapDrawable) able;
		Bitmap bitmap = bd.getBitmap();
		fullscreen.setImageBitmap(bitmap);
		fullscreen.setVisibility(View.VISIBLE);
	}

	public void large() {
		Drawable able = showimage.getDrawable();
		BitmapDrawable bd = (BitmapDrawable) able;
		Bitmap bitmap = bd.getBitmap();
		int bmpWidth = bitmap.getWidth();
		int bmpHeight = bitmap.getHeight();
		double scale = 1.25;
		float scaleWidth = 1;
		float scaleHeight = 1;
		scaleWidth = (float) (scaleWidth * scale);
		scaleHeight = (float) (scaleHeight * scale);
		if (bmpWidth * scaleWidth > screenWidth
				|| bmpHeight * scaleHeight > screenHeight) {
			Toast.makeText(getBaseContext(),getResources().getString(R.string.not_more_large), Toast.LENGTH_SHORT)
					.show();
			return;
		}
		Matrix matrix = new Matrix();
		matrix.postScale(scaleWidth, scaleHeight);
		Bitmap resizeBmp = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth,
				bmpHeight, matrix, true);
		showimage.setImageBitmap(resizeBmp);
	}

	public void small() {
		Drawable able = showimage.getDrawable();
		BitmapDrawable bd = (BitmapDrawable) able;
		Bitmap bitmap = bd.getBitmap();
		int bmpWidth = bitmap.getWidth();
		int bmpHeight = bitmap.getHeight();
		double scale = 0.75;
		float scaleWidth = 1;
		float scaleHeight = 1;
		scaleWidth = (float) (scaleWidth * scale);
		scaleHeight = (float) (scaleHeight * scale);
		if (bmpWidth * scaleWidth < 10 || bmpHeight * scaleHeight < 10) {
			Toast.makeText(getBaseContext(), getResources().getString(R.string.not_more_small), Toast.LENGTH_SHORT)
					.show();
			return;
		}
		Matrix matrix = new Matrix();
		matrix.postScale(scaleWidth, scaleHeight);
		Bitmap resizeBmp = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth,
				bmpHeight, matrix, true);
		showimage.setImageBitmap(resizeBmp);
	}

	public void rotate(int value) {
		Drawable able = showimage.getDrawable();
		BitmapDrawable bd = (BitmapDrawable) able;
		Bitmap bitmap = bd.getBitmap();
		int bmpWidth = bitmap.getWidth();
		int bmpHeight = bitmap.getHeight();
		if (bmpWidth < showimage.getWidth()
				&& bmpHeight < showimage.getHeight()) {
			int newwidth = bitmap.getHeight();
			int newheight = bitmap.getWidth();
			float scaleWidth = ((float) newwidth) / bmpWidth;
			float scaleHeight = ((float) newheight) / bmpHeight;
			Matrix matrix = new Matrix();
			matrix.postScale(scaleWidth, scaleHeight);
			matrix.postRotate(value);
			Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth,
					bmpHeight, matrix, true);
			showimage.setImageBitmap(resizedBitmap);
		} else {
			int newwidth = showimage.getWidth();
			int newheight = showimage.getHeight();
			float scaleWidth = ((float) newwidth) / bmpWidth;
			float scaleHeight = ((float) newheight) / bmpHeight;
			Matrix matrix = new Matrix();
			matrix.postScale(scaleWidth, scaleHeight);
			matrix.postRotate(value);
			Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth,
					bmpHeight, matrix, true);
			showimage.setImageBitmap(resizedBitmap);
		}
	}

	public void onStop() {
		super.onStop();
		abortWorker();
		getContentResolver().unregisterContentObserver(mDbObserver);
		mAdapter = null;
		gridview.setAdapter(null);
	}

	private void rebake(boolean unmounted, boolean scanning) {
		if (unmounted == mUnmounted && scanning == mScanning) {
			return;
		}
		abortWorker();
		mUnmounted = unmounted;
		mScanning = scanning;
		if (mUnmounted) {
		} else {
			startWorker();
		}
	}

	volatile boolean mAbort = false;

	private void startWorker() {
		mAbort = false;
		mWorkerThread = new Thread("GalleryPicker Worker") {
			@Override
			public void run() {
				workerRun();
			}
		};
		BitmapManager.instance().allowThreadDecoding(mWorkerThread);
		mWorkerThread.start();
	}

	private void workerRun() {
		ArrayList<Item> allItems = new ArrayList<Item>();

		checkScanning();
		if (mAbort)
			return;

		checkImageList(allItems);
		if (mAbort)
			return;

		checkBucketIds(allItems);
		if (mAbort)
			return;

		checkThumbBitmap(allItems);
		if (mAbort)
			return;

		checkLowStorage();
	}

	private static final long LOW_STORAGE_THRESHOLD = 1024 * 1024 * 2;

	private void checkLowStorage() {
		// Check available space only if we are writable
		if (Constanst.hasStorage()) {
			String storageDirectory = Environment.getExternalStorageDirectory()
					.toString();
			StatFs stat = new StatFs(storageDirectory);
			long remaining = (long) stat.getAvailableBlocks()
					* (long) stat.getBlockSize();
			if (remaining < LOW_STORAGE_THRESHOLD) {
				mHandler.post(new Runnable() {
					public void run() {
						checkLowStorageFinished();
					}
				});
			}
		}
	}

	private void checkLowStorageFinished() {
		Toast.makeText(this, R.string.not_enough_space, 5000).show();
	}

	private void checkThumbBitmap(ArrayList<Item> allItems) {
		for (Item item : allItems) {
			final ArrayList<Bitmap> thumblist = getThumbBitmap(item.mImageList);
			final Item finalItem = item;
			mHandler.post(new Runnable() {
				public void run() {
					updateThumbBitmap(finalItem, thumblist);
				}
			});
		}
	}

	private ArrayList<Bitmap> getThumbBitmap(IImageList images) {
		int count = images.getCount();
		ArrayList<Bitmap> maplist = new ArrayList<Bitmap>();
		for (int i = 0; i < 4; i++) {
			Bitmap temp = null;
			IImage image = i < count ? images.getImageAt(i) : null;
			if (image != null) {
				temp = image.miniThumbBitmap();
			}
			if (temp != null) {
				temp = ThumbnailUtils.extractThumbnail(temp, 15, 15);
				maplist.add(temp);
			}
		}
		return maplist;
	}

	private void updateThumbBitmap(Item item, ArrayList<Bitmap> list) {
		item.setThumbList(list);
		mAdapter.updateDisplay();
	}

	private static final String CAMERA_BUCKET = Constanst.CAMERA_IMAGE_BUCKET_ID;

	private void checkBucketIds(ArrayList<Item> allItems) {
		final IImageList allImages;
		if (!mScanning && !mUnmounted) {
			allImages = Constanst.makeImageList(getContentResolver(),
					Constanst.DataLocation.ALL, Constanst.INCLUDE_IMAGES
							,
					Constanst.SORT_DESCENDING, null);
		} else {
			allImages = Constanst.makeEmptyImageList();
		}

		if (mAbort) {
			allImages.close();
			return;
		}

		HashMap<String, String> hashMap = allImages.getBucketIds();
		allImages.close();
		if (mAbort)
			return;

		for (Map.Entry<String, String> entry : hashMap.entrySet()) {
			String key = entry.getKey();
			if (key == null) {
				continue;
			}
			if (!key.equals(CAMERA_BUCKET)) {
				IImageList list = createImageList(Constanst.INCLUDE_IMAGES
						| Constanst.INCLUDE_VIDEOS, key, getContentResolver());
				if (mAbort)
					return;

				Item item = new Item(Item.TYPE_NORMAL_FOLDERS, key,
						entry.getValue(), list);

				allItems.add(item);

				final Item finalItem = item;
				mHandler.post(new Runnable() {
					public void run() {
						updateItem(finalItem);
					}
				});
			}
		}

	}

	private static final class ImageListData {
		int mType;
		int mInclude;
		String mBucketId;
		int mStringId;

		ImageListData(int type, int include, String bucketId, int stringId) {
			mType = type;
			mInclude = include;
			mBucketId = bucketId;
			mStringId = stringId;
		}

	}

	private static final ImageListData[] IMAGE_LIST_DATA = { new ImageListData(
			Item.TYPE_ALL_IMAGES, Constanst.INCLUDE_IMAGES, null,
			R.string.all_images),

	};

	private void checkImageList(ArrayList<Item> allItems) {
		int length = IMAGE_LIST_DATA.length;
		IImageList[] lists = new IImageList[length];
		for (int i = 0; i < length; i++) {
			ImageListData data = IMAGE_LIST_DATA[i];
			lists[i] = createImageList(data.mInclude, data.mBucketId,
					getContentResolver());
			if (mAbort)
				return;
			Item item = null;

			if (lists[i].isEmpty())
				continue;
			if (i >= 3 && lists[i].getCount() == lists[i - 3].getCount()) {
				continue;
			}

			item = new Item(data.mType, data.mBucketId, getResources()
					.getString(data.mStringId), lists[i]);

			allItems.add(item);

			final Item finalItem = item;
			mHandler.post(new Runnable() {
				public void run() {
					updateItem(finalItem);
				}
			});
		}
	}

	private void updateItem(Item item) {
		if (mAdapter.getCount() == 0) {

		}
		mAdapter.addItem(item);
		mAdapter.updateDisplay();
	}

	private IImageList createImageList(int mediaTypes, String bucketId,
			ContentResolver cr) {
		IImageList list = Constanst.makeImageList(cr,
				Constanst.DataLocation.ALL, mediaTypes,
				Constanst.SORT_DESCENDING, bucketId);
		mAllLists.add(list);
		return list;
	}

	private void clearImageLists() {
		for (IImageList list : mAllLists) {
			list.close();
		}
		mAllLists.clear();
	}

	private void checkScanning() {
		ContentResolver cr = getContentResolver();
		final boolean scanning = Constanst.isMediaScannerScanning(cr);
		mHandler.post(new Runnable() {
			public void run() {
				checkScanningFinished(scanning);
			}
		});
	}

	private void checkScanningFinished(boolean scanning) {
		updateScanningDialog(scanning);
	}

	public void updateScanningDialog(boolean scanning) {
		boolean prevScanning = (mMediaScanningDialog != null);

		// xfzhang
		if (mAdapter == null || mAdapter.mItems == null) {
			// Log.e("TAG", "mAdapter is"+(mAdapter==null));
			return;
		}
		if (prevScanning == scanning && mAdapter.mItems.size() == 0)
			return;
		// Now we are certain the state is changed.
		// Log.e("TAG",
		// "mMediaScanningDialog null is "+(mMediaScanningDialog==null));
		if (mMediaScanningDialog != null) {
			mMediaScanningDialog.cancel();
			mMediaScanningDialog = null;
		} else if (scanning && mAdapter != null && mAdapter.mItems.size() == 0) {

			try {
				mMediaScanningDialog = ProgressDialog.show(this, null,
						getResources().getString(R.string.wait), true, true);
			} catch (NullPointerException e) {
				Log.e("TAG", e.getMessage());
			}
		}
	}

	private void abortWorker() {
		if (mWorkerThread != null) {
			BitmapManager.instance().cancelThreadDecoding(mWorkerThread);
			mAbort = true;
			try {
				mWorkerThread.join();
			} catch (InterruptedException ex) {

			}
			mWorkerThread = null;
			// Remove all runnables in mHandler.
			// (We assume that the "what" field in the messages are 0
			// for runnables).
			mHandler.removeMessages(0);
			mAdapter.clear();
			mAdapter.updateDisplay();
			clearImageLists();
		}
	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK) {
			if (fullscreen.getVisibility() == View.VISIBLE) {
				fullscreen.setVisibility(View.GONE);
				mHandler.removeCallbacks(mRunnable);
				mHandler.removeCallbacks(randomRunnable);
				return true;
			}
			return super.onKeyDown(keyCode, event);
		} else {
			return super.onKeyDown(keyCode, event);
		}
	}

	public boolean onDown(MotionEvent event) {
		return true;
	}

	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		if (nowImagelist == null) {
			return false;
		}
		if (e1.getX() - e2.getX() < -120) {
			index--;
			if (index < 0) {
				index = nowImagelist.getCount() - 1;
			}
			fullscreen.setImageURI(nowImagelist.getImageAt(index)
					.fullSizeImageUri());
			return true;
		} else if (e1.getX() - e2.getX() > 120) {
			index++;
			if (index >= nowImagelist.getCount()) {
				index = 0;
			}
			fullscreen.setImageURI(nowImagelist.getImageAt(index)
					.fullSizeImageUri());
			return true;
		}
		return true;
	}

	public boolean onTouchEvent(MotionEvent event) {
		return this.detector.onTouchEvent(event);
	}

	public void onLongPress(MotionEvent e) {

	}

	public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
			float distanceY) {

		return false;
	}

	public void onShowPress(MotionEvent e) {

	}

	public boolean onSingleTapUp(MotionEvent e) {

		return false;
	}

}
图片项目源码


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值