ImageUtils.java:
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;
import android.widget.ImageView;
/**
* @ClassName: ImageUtils
* @Description: 处理图片的工具类
* @author chenzheng
* @date 2014-4-17 下午3:11:08
*/
public class ImageUtils {
/**
* 图片基准路径
*/
private static final String BASE_SDCARD_IMAGES = "/mnt/sdcard/weijie/images/";
private static final String TAG = "ImageUtils";
/**
* 判断文件是否存在
*
* @param 文件在本地的完整名
* @return
*/
private static boolean judgeExists(String fullName) {
File file = new File(fullName);
return file.exists();
}
/**
* 获取最后的‘/’后的文件名
*
* @param name
* @return
*/
private static String getLastName(String name) {
int lastIndexOf = 0;
try {
lastIndexOf = name.lastIndexOf('/');
} catch (Exception e) {
e.printStackTrace();
}
return !name.equals("") ? name.substring(lastIndexOf + 1) : "";
}
/**
* 拼接一个完整的本地文件名
* @param 文件的网络路径
* @return
*/
private static String getImageFullName(String name) {
return BASE_SDCARD_IMAGES + getLastName(name);
}
/**
* 通过该网络路径获取Bitmap
* @param 该图片的网络路径
*/
public static Bitmap getBitmap(String urlPath) {
Bitmap bitmap = null;
String fullName = getImageFullName(urlPath);
if (ImageUtils.judgeExists(fullName)) {
/* 存在就直接使用 */
Log.i(TAG, "使用了sdcard里的图片");
bitmap = BitmapFactory.decodeFile(fullName);
} else {
/* 去下载图片,下载完成之后返回该对象 */
Log.i(TAG, "去下载了图片");
bitmap = downloadAndSaveBitmap(urlPath, fullName);
}
return bitmap;
}
/**
* 下载保存图片
*
* @param urlPath
* 下载路径
* @param fullName
* 文件保存路径+文件名
* @return
*/
private static Bitmap downloadAndSaveBitmap(String urlPath, String fullName) {
Bitmap bitmap = downloadImage(urlPath);
/* 首先判断是否挂载了sdcard */
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
if (bitmap != null) {
saveBitmap(fullName, bitmap);
}
} else {
Log.e(TAG, "没有sdcard无法保存图片");
}
return bitmap;
}
/**
* 保存图片
*
* @param fullName
* @param bitmap
*/
private static void saveBitmap(String fullName, Bitmap bitmap) {
if (bitmap != null) {
try {
File file = new File(fullName);
if (!file.exists()) {
creatFolder(fullName);
file.createNewFile();
}
FileOutputStream fos = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.flush();
} catch (IOException e) {
e.printStackTrace();
Log.e(TAG, "图片保存失败,异常信息是:" + e.toString());
}
} else {
Log.e(TAG, "没有下载成功图片,无法保存");
}
}
/**
* 创建保存文件的文件夹
*
* @param fullName
* 带文件名的文件路径
* @return
*/
private static void creatFolder(String fullName) {
if (getLastName(fullName).contains(".")) {
String newFilePath = fullName.substring(0, fullName
.lastIndexOf('/'));
File file = new File(newFilePath);
file.mkdirs();
}
}
/**
* 下载图片
*
* @param urlPath
* @return
*/
private static Bitmap downloadImage(String urlPath) {
try {
byte[] byteData = getImageByte(urlPath);
if (byteData == null) {
Log.e(TAG, "没有得到图片的byte,问题可能是path:" + urlPath);
return null;
}
int len = byteData.length;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
options.inPurgeable = true;
options.inInputShareable = true;
options.inJustDecodeBounds = false;
if (len > 200000) {// 大于200K的进行压缩处理
options.inSampleSize = 2;
}
return BitmapFactory.decodeByteArray(byteData, 0, len);
} catch (Exception e) {
e.printStackTrace();
Log.e(TAG, "图片下载失败,异常信息是:" + e.toString());
return null;
}
}
/**
* 获取图片的byte数组
*
* @param urlPath
* @return
*/
private static byte[] getImageByte(String urlPath) {
InputStream in = null;
byte[] result = null;
try {
URL url = new URL(urlPath);
HttpURLConnection httpURLconnection = (HttpURLConnection) url
.openConnection();
httpURLconnection.setDoInput(true);
httpURLconnection.connect();
if (httpURLconnection.getResponseCode() == 200) {
in = httpURLconnection.getInputStream();
result = readInputStream(in);
in.close();
} else {
Log
.e(TAG, "下载图片失败,状态码是:"
+ httpURLconnection.getResponseCode());
}
} catch (Exception e) {
Log.e(TAG, "下载图片失败,原因是:" + e.toString());
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}
/**
* 将输入流转为byte数组
*
* @param in
* @return
* @throws Exception
*/
private static byte[] readInputStream(InputStream in) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = in.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
baos.close();
in.close();
return baos.toByteArray();
}
/**
* 此方法用来异步加载图片
* @param imageview
* @param path
*/
public static void downloadAsyncTask(final ImageView imageview,
final String path) {
new AsyncTask<String, Void, Bitmap>() {
@Override
protected Bitmap doInBackground(String... params) {
return getBitmap(path);
}
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
if (result != null && imageview != null) {
imageview.setImageBitmap(result);
} else {
Log.e(TAG, "在downloadAsyncTask里异步加载图片失败!");
}
}
}.execute(new String[] {});
}
}
ProductDetailIndex.java:
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import com.weijie.app_user.R;
import com.weijie.app_user.utility.ImageUtils;
public class ProductDetailIndex extends Activity {
private ViewPager viewPager; // android-support-v4中的滑动组件
private int default_bg=R.drawable.a;
private List<ImageView> imageViews; // 滑动的图片集合
private String[] imageResUrl; // 图片url
private List<ImageView> dots; // 图片标题正文的那些点
private int currentItem = 0; // 当前图片的索引号
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
if (msg.what == 0) {
@SuppressWarnings("unchecked")
List<Bitmap> bmList=(List<Bitmap>) msg.obj;
for(int i=0;i<bmList.size();i++){
Bitmap bitmap=bmList.get(i);
ImageView imageView = new ImageView(getApplicationContext());
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
} else {
imageView.setImageResource(default_bg);
}
imageView.setScaleType(ScaleType.CENTER_CROP);
imageViews.add(imageView);
}
viewPager = (ViewPager) findViewById(R.id.img_viewpager);
viewPager.setAdapter(new MyPagerAdapter());// 设置填充ViewPager页面的适配器
// 设置一个监听器,当ViewPager中的页面改变时调用
viewPager.setOnPageChangeListener(new MyPageChangeListener());
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.product_detail_index);
imageViews = new ArrayList<ImageView>();
new Thread() {
@SuppressWarnings("unchecked")
public void run() {
List<Bitmap> bitmapList = new ArrayList<Bitmap>();
Message msg = new Message();
Bitmap bitmap=null;
imageResUrl = new String[] {
"http://imgt8.bdstatic.com/it/u=2,1200870009&fm=19&gp=0.jpg",
"http://imgt3.bdstatic.com/it/u=2483720495,3389680904&fm=21&gp=0.jpg",
"http://imgt6.bdstatic.com/it/u=2,936516090&fm=19&gp=0.jpg" };
for (int i = 0; i < imageResUrl.length; i++) {
bitmap=ImageUtils.getBitmap(imageResUrl[i]);
bitmapList.add(bitmap);
}
msg.what = 0;
msg.obj = bitmapList;
handler.sendMessage(msg);
}
}.start();
dots = new ArrayList<ImageView>();
dots.add((ImageView) findViewById(R.id.v_dot1));
dots.add((ImageView) findViewById(R.id.v_dot2));
dots.add((ImageView) findViewById(R.id.v_dot3));
dots.get(currentItem).setImageResource(R.drawable.orange_btn);
}
/**
* 填充ViewPager页面的适配器
*
* @author Administrator
*
*/
private class MyPagerAdapter extends PagerAdapter {
@Override
public int getCount() {
return imageResUrl.length;
}
@Override
public Object instantiateItem(View arg0, int arg1) {
((ViewPager) arg0).addView(imageViews.get(arg1));
return imageViews.get(arg1);
}
@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
((ViewPager) arg0).removeView((View) arg2);
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void startUpdate(View arg0) {
}
@Override
public void finishUpdate(View arg0) {
}
}
/**
* 当ViewPager中页面的状态发生改变时调用
*
* @author Administrator
*
*/
private class MyPageChangeListener implements OnPageChangeListener {
private int oldPosition = 0;
public void onPageSelected(int position) {
currentItem = position;
dots.get(oldPosition).setImageResource(R.drawable.white_btn);
dots.get(position).setImageResource(R.drawable.orange_btn);
oldPosition = position;
}
public void onPageScrollStateChanged(int arg0) {
}
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
}
}
product_detail_index.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/white" android:orientation="vertical" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="50dp" android:background="@color/orange" android:orientation="horizontal" > <ImageView android:id="@+id/header_back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="10dp" android:src="@drawable/reg_back" /> <!-- 商品详情 --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="10dp" android:layout_toRightOf="@id/header_back" android:text="商品详情" android:textColor="@color/white" android:textSize="24sp" /> <ImageView android:id="@+id/three_dot" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginLeft="15dp" android:layout_marginRight="10dp" android:src="@drawable/shop_threedot" /> <LinearLayout android:id="@+id/goods_share" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_toLeftOf="@id/three_dot" android:gravity="center" android:orientation="vertical" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/goods_share" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="分享" android:textColor="@color/white" android:textSize="14sp" /> </LinearLayout> </RelativeLayout> <FrameLayout android:layout_width="fill_parent" android:layout_height="240dp" > <android.support.v4.view.ViewPager android:id="@+id/img_viewpager" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:layout_gravity="bottom" android:layout_marginBottom="8dp" android:orientation="horizontal" > <ImageView android:id="@+id/v_dot1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/white_btn" /> <ImageView android:id="@+id/v_dot2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:src="@drawable/white_btn" /> <ImageView android:id="@+id/v_dot3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/white_btn" /> </LinearLayout> </FrameLayout> </LinearLayout>