一个在平板(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;
}
}
图片项目源码