`

Android左右滑动切换图片

阅读更多

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>

 

  • 大小: 81 KB
分享到:
评论

相关推荐

    android左右滑动切换图片

    这个"android左右滑动切换图片"的项目就是为此目的设计的。通过这个项目,我们可以学习如何利用Android的视图滚动类,如ViewPager或者ViewFlipper,以及适配器(Adapter)机制来实现这一效果。下面将详细讲解实现这...

    Android左右滑动切换图片功能

    在Android开发中,实现左右滑动切换图片的功能是一项常见的需求,尤其在制作各种类型的APP时,如相册、轮播图或产品展示等。这个功能可以让用户通过手指左右滑动来浏览图片,提供了良好的用户体验。下面我们将深入...

    android点击查看大图,ViewPager实现左右滑动切换、缩放图片

    本示例主要讲解如何使用ViewPager实现左右滑动切换图片,并结合手势操作支持图片的缩放。以下是对这个功能的详细解析: 首先,`ViewPager`是Android SDK中的一个控件,它允许用户在多个页面间进行左右滑动切换。在...

    Android使用Photoview实现图片左右滑动及缩放功能

    在Android应用开发中,展示图片并提供用户交互是常见的需求,比如左右滑动浏览多张图片和双指缩放操作。`Photoview`库是一个非常实用的工具,它为Android提供了图片手势处理,包括平移、缩放等功能。本文将详细介绍...

    Android实现图片左右滚动,点击对应放大且可以缩放

    Android代码,自定义HorizontalScrollView,实现图片左右滑动切换,点击对应图片,加载对应图片,且双击和手指实现缩放功能,单击一下退出,结合了几个例子,写的一个比较完整一点的Demo,希望对需要此功能的人有所...

    android左右滑动翻页查看图片

    在Android开发中,实现左右滑动翻页查看图片的功能是一项常见的需求,特别是在设计相册、画廊或者幻灯片展示等应用时。本教程将详细讲解如何利用Android的手势识别接口来实现这一功能。 首先,我们需要了解Android...

    Android实现滑屏图片左右滑动切换.rar

    Android实现滑屏图片左右滑动切换,可以自动滑动,仿优酷Android客户端图片左右滑动,类似电脑上的焦点图和幻灯片切换效果。编程思路:设置填充ViewPager页面的适配器,设置一个监听器,当ViewPager中的页面改变时...

    仿探探左右滑动切换图片效果

    在IT行业中,用户界面的设计和交互体验至关重要,而“仿探探左右滑动切换图片效果”就是一个很好的示例,展示了如何提升应用的吸引力和用户体验。探探是一款知名的社交应用程序,其核心功能之一就是通过左右滑动来...

    Android图片左右滑动切换查看器.rar

    Android图片左右滑动切换查看器,Android手机的图片查看器,看图程序,在layout中定义的属性,也可以在代码中指定。  mViewFlipper.showNext(); //该方法显示下一个图片信息;  mViewFlipper.startFlipping();/...

    android左右滑动的选择控件

    在Android开发中,创建一个可左右滑动的选择控件是一个常见的需求,这通常涉及到自定义View或者使用现有的库来实现。这种控件可以用于展示多个选项,用户通过左右滑动来浏览和选择。下面我们将详细探讨如何实现这样...

    Android实现图片左右滑动效果

    ViewPager允许用户通过左右滑动手势在多个页面之间切换,非常适合用来展示图片。 首先,我们需要在布局文件中添加ViewPager。ViewPager通常会包裹在一个父布局,如LinearLayout或RelativeLayout中,然后通过设置...

    android之实现图片左右滑动 点击放大功能.zip

    - **ViewPager**:Android官方推荐使用ViewPager组件来实现图片的左右滑动切换。ViewPager可以承载多个页面,并且允许用户通过左右滑动来切换页面。对于图片浏览,每个页面通常对应一张图片。 - **PagerAdapter**...

    Android实现图片手势缩放、移动、双击放大缩小

    Android实现图片手势缩放、移动、双击放大缩小。

    android页面滑动切换(带多种动画效果)

    在Android开发中,页面滑动切换是用户界面中常见的交互方式,它提供了平滑而直观的导航体验。本文将深入探讨如何实现Android页面滑动切换,并重点介绍如何添加多种动画效果,包括移动、缩放和旋转等。 首先,我们要...

    ViewPager的使用方法(实现左右滑动切换页面)

    ViewPager是Android平台中一个强大的视图滑动组件,它允许用户通过左右滑动来浏览多个页面,常用于实现类似Tab的界面效果,如微信、淘宝等应用中的底部导航栏。在Android开发中,ViewPager通常与PagerAdapter配合...

    Android高级应用源码-Android实现左右滑动查看图片效果.zip

    它会自动管理屏幕上的页面滑动,支持左右滑动切换。开发者需要创建一个`PagerAdapter`子类,重写`getCount()`、`instantiateItem(ViewGroup, int)`和`destroyItem(ViewGroup, int, Object)`方法,来提供数据和管理...

    android滑动切换图片 工程包

    在Android开发中,滑动切换图片是一项常见的需求,例如在应用的启动页、相册功能或者轮播广告中。这个“android滑动切换图片 工程包”提供了一个实现这一功能的解决方案。下面我们将深入探讨相关知识点。 1. **...

    手势滑动切换activity

    5. 可选地,自定义手势识别器(如`GestureDetector`或`SwipeRefreshLayout`)以实现更复杂的手势操作,如左右滑动切换Activity。 在压缩包中的`ConfigTabActivity`源代码中,你可以看到这些组件和方法的具体实现。...

    Android图片自动滑动功能示例代码.rar

    Android界面图片自动滑动功能示例代码,安卓UI开发的一个小例子,仿优酷视频的客户端应用的图片滑动效果,仿优酷Android客户端图片左右滑动特效,采用android-support-v4中的滑动组件,滑动切换所有的图片,每次滚动...

    android实现左右滑切换图片

    自己是初学者 开发的一个小程序 希望对有需要的人有帮助

Global site tag (gtag.js) - Google Analytics