android之查看图片的程序 ImageSwitcher Gallery的配合应用---版本2

来源:互联网 发布:raid2数据图 编辑:程序博客网 时间:2024/06/16 14:23

示意图:

其实效果图还是一样的,只不过这里添加了这么以下几个功能:

第一:下方图片的自适应长宽(在保证长宽比例的情况下哦)

第二:触摸大图同样可以进行图片切换(没有机器,没法测试,但是基本的思路还是正确的)

代码:

activity代码:

[java:nogutter] view plaincopyprint?
  1. package cn.com.chenzheng_java;
  2. import java.text.DecimalFormat;
  3. import android.app.Activity;
  4. import android.content.Context;
  5. import android.content.res.Resources;
  6. import android.graphics.Bitmap;
  7. import android.graphics.BitmapFactory;
  8. import android.os.Bundle;
  9. import android.util.Log;
  10. import android.view.MotionEvent;
  11. import android.view.View;
  12. import android.view.ViewGroup;
  13. import android.view.Window;
  14. import android.view.View.OnTouchListener;
  15. import android.view.animation.AnimationUtils;
  16. import android.widget.AdapterView;
  17. import android.widget.BaseAdapter;
  18. import android.widget.Gallery;
  19. import android.widget.ImageSwitcher;
  20. import android.widget.ImageView;
  21. import android.widget.Toast;
  22. import android.widget.AdapterView.OnItemSelectedListener;
  23. import android.widget.Gallery.LayoutParams;
  24. import android.widget.ImageView.ScaleType;
  25. import android.widget.ViewSwitcher.ViewFactory;
  26. /**
  27. * @description 对图片的一个小小展示
  28. * @author chenzheng_java
  29. * @since 2011/3/17
  30. *
  31. */
  32. public class GalleryActivityextends Activity implements OnItemSelectedListener ,OnTouchListener{
  33. int[] imagesId = newint[] { R.drawable.a1, R.drawable.a2, R.drawable.a3,
  34. R.drawable.a4
  35. };
  36. int index = 0;
  37. ImageSwitcher imageSwitcher;
  38. int maxImageWidth = 70;
  39. int maxImageHeight =100;
  40. @Override
  41. protected void onCreate(Bundle savedInstanceState) {
  42. super.onCreate(savedInstanceState);
  43. /**
  44. * 设置窗口无标题栏,一定要在setContentView前进行设置哦
  45. */
  46. requestWindowFeature(Window.FEATURE_NO_TITLE);
  47. setContentView(R.layout.gallery);
  48. Gallery gallery = (Gallery) findViewById(R.id.gallery1);
  49. gallery.setOnItemSelectedListener(this);
  50. imageSwitcher = (ImageSwitcher) findViewById(R.id.imageSwitcher);
  51. imageSwitcher.setVisibility(View.VISIBLE);
  52. /***
  53. * setInAnimation可以设置淡入动画
  54. * setOutAnimation可以设置淡出动画
  55. */
  56. imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(
  57. getApplicationContext(), android.R.anim.fade_in));
  58. imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(
  59. getApplicationContext(), android.R.anim.fade_out));
  60. imageSwitcher.setFactory(new ViewFactory() {
  61. /**
  62. * 创建一个新的图片放置到ImageSwitcher上,可以使用其设置背景哦。
  63. * 一般只会在创建时调用一次。相当于为我们创建一个进行动画效果时的一个背景图。
  64. * 此方法亦可以通过setView替代
  65. */
  66. @Override
  67. public View makeView() {
  68. ImageView imageView = new ImageView(GalleryActivity.this);
  69. // 设置截取模式
  70. imageView.setScaleType(ScaleType.CENTER_INSIDE);
  71. imageView.setBackgroundResource(R.drawable.ground);
  72. Toast.makeText(getApplicationContext(), "执行了一次",
  73. Toast.LENGTH_SHORT).show();
  74. return imageView;
  75. }
  76. });
  77. gallery.setVisibility(View.VISIBLE);
  78. gallery.setAdapter(new ImageAdapter(this));
  79. }
  80. class ImageAdapter extends BaseAdapter {
  81. private Context context2;
  82. public ImageAdapter(Context context) {
  83. context2 = context;
  84. }
  85. @Override
  86. public int getCount() {
  87. return imagesId.length;
  88. }
  89. @Override
  90. public Object getItem(int position) {
  91. return imagesId[position];
  92. }
  93. @Override
  94. public long getItemId(int position) {
  95. return position;
  96. }
  97. /***
  98. * 该方法的实现稍微复杂一些,主要思想就是,要对图片的大小进行自动剪裁,让其正好宽或者长顶到允许的最大值
  99. * 这里主要用到了BitmapFactory Bitmap 用于图片获取和处理
  100. * DecaimalFormat 用于对double数据进行格式规划(这里是只允许小数点后两位)
  101. */
  102. @Override
  103. public View getView(int position, View convertView, ViewGroup parent) {
  104. index = position;
  105. ImageView image = new ImageView(context2);
  106. Resources resources = context2.getResources();
  107. // 加载图片为Bitmap位图
  108. Bitmap bitmap = BitmapFactory.decodeResource(resources, imagesId[position]);
  109. Log.i("是否可以decode这张图片", (bitmap!=null)+"");
  110. // 图片的原始大小
  111. int bitMapWidth = bitmap.getWidth();
  112. int bitMapHeight = bitmap.getHeight();
  113. Log.i("bitMapWidth", bitMapWidth+"");
  114. Log.i("bitMapHeight", bitMapHeight+"");
  115. // 缩小或者放大的倍数关系
  116. double scale;
  117. double widthScale = (maxImageWidth*100)/(bitMapWidth*100.0);//这里乘以100然后除以100.0的目的是为了让其返回double类型
  118. double heightScale = (maxImageHeight*100)/(bitMapHeight*100.0);
  119. // 规划获得的格式(小数点后两位)
  120. DecimalFormat decimalFormat = new DecimalFormat("#.00");
  121. widthScale = Double.valueOf(decimalFormat.format(widthScale));
  122. heightScale = Double.valueOf(decimalFormat.format(heightScale));
  123. Log.i("widthScale", widthScale+"");
  124. Log.i("heightScale", heightScale+"");
  125. if(widthScale>= heightScale){
  126. scale = widthScale;
  127. }
  128. else{
  129. scale = heightScale;
  130. }
  131. Log.i("scale", scale+"");
  132. // 根据原图片生成一个缩放后的图片
  133. Bitmap bitmap2 = Bitmap.createScaledBitmap(bitmap, (int)(bitMapWidth*scale), (int)(bitMapHeight*scale),true);
  134. // 将图片绑定到ImageView
  135. image.setImageBitmap(bitmap2);
  136. /**
  137. * setScaleType()可以设置当图片大小和容器大小不匹配时的剪辑模式.
  138. * ScaleType.CENTER_INSIDE的意思是,按图片的原比例缩小或者扩大,直到长或者宽中的任何一个顶到容器为止
  139. * 因为在上面我们已经重新生成了一个图片放在gallery上,大小已经符合要求了,所以这里就不需要再通过
  140. * setScaleType进行剪裁了。有些人可能觉得笔者脑子有病,有简单的不用,非要用那么复杂的,这里呢,其实只是
  141. * 给大家的一个使用范例,我们通过bitmap可不仅仅是缩放图片哦,还可以倾斜、移动等等……
  142. */
  143. // image.setScaleType(ScaleType.CENTER_INSIDE);
  144. image.setAdjustViewBounds(true);// 自适应边框处理
  145. image.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
  146. return image;
  147. }
  148. }
  149. /**
  150. * 当gallery的图像发生变化时,同步ImageSwitcher的变化
  151. */
  152. @Override
  153. public void onItemSelected(AdapterView<?> parent, View view,int position,
  154. long id) {
  155. imageSwitcher.setImageResource(imagesId[position]);
  156. }
  157. @Override
  158. public void onNothingSelected(AdapterView<?> parent) {
  159. }
  160. int i = 0 ;
  161. /***
  162. * 屏幕被触摸时提供的方法,这里我们通过它来实现拖动大图片,也会自动切换图片o
  163. */
  164. @Override
  165. public boolean onTouch(View v, MotionEvent event) {
  166. Log.i("是否正在触摸", "yes");
  167. int actionName = event.getAction();
  168. float []position =null;
  169. //被按下时
  170. if(actionName==MotionEvent.ACTION_DOWN){
  171. i = 0;
  172. }
  173. // 被按着拖动时
  174. if(actionName == MotionEvent.ACTION_MOVE)
  175. {
  176. position[i] = event.getX();
  177. ++i;
  178. }
  179. if(actionName == MotionEvent.ACTION_UP)
  180. {
  181. if(position[position.length]>position[position.length-1]){
  182. if((index+1)>imagesId.length){
  183. imageSwitcher.setImageResource(imagesId[index]);
  184. }
  185. else{
  186. imageSwitcher.setImageResource(imagesId[index+1]);
  187. }
  188. }
  189. else{
  190. if((index-1)<0){
  191. imageSwitcher.setImageResource(imagesId[0]);
  192. }
  193. else{
  194. imageSwitcher.setImageResource(imagesId[index-1]);
  195. }
  196. }
  197. }
  198. return true;
  199. }
  200. }

gallery.xml

[xhtml:nogutter] view plaincopyprint?
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. android:orientation="vertical"
  7. android:gravity="center_horizontal"
  8. >
  9. <ImageSwitcher
  10. android:id="@+id/imageSwitcher"
  11. android:layout_height="350dp"
  12. android:layout_width="fill_parent"
  13. ></ImageSwitcher>
  14. <Galleryandroid:id="@+id/gallery1"
  15. android:gravity="center"
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"></Gallery>
  18. </LinearLayout>

-----------------------------------------------------------

有问题的大家一起交流!

原创粉丝点击