`

2011.10.09——— android ImageView放大缩小(2)

阅读更多
2011.10.09——— android ImageView放大缩小(2)

参考:http://www.eoeandroid.com/thread-54846-1-1.html
http://blog.csdn.net/lishubing1126/article/details/4926770

需求:
在一个ListView里面 做一个展示图片的效果 点击item图片后 放大到屏幕中间,再点击缩小
实现:
刚开始 就仿照上一篇博客写 不久行了嘛

随之 遇见的问题接踵而来

1、在listview里面 放大的时候 只会显示在item里面 撑大item那怎么办呢?
    这个图片本来就是在item里面 我又不可能让它不在item里面 所以 这个就很郁闷了
这时 我想到了以前做拖拽的时候 通过getDrawingCache()来得到缓存图片 然后把它加到最外层的layout里面 不久可以了吗 哈哈哈

2、因为图片要展示在中间 所以应该有一个移动的过程 就需要TranslateAnimation了 当然我们需要AnimationSet来整个两个动画效果

但是 TranslateAnimation里面 是需要计算偏移量的 这时候 就不能用clickListener了 我用了setOnTouchListener

具体代码如下:


package com.lp;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.AnimationUtils;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.view.animation.Animation.AnimationListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;

class ListItemInf{
	int cImg;
};




public class MainActivity extends Activity {

	private ArrayList<ListItemInf> mData;
	MyAdapter adapter;
	
	private boolean isClick = false;
	
	private ListView lv;
	private LinearLayout ll;
	private RelativeLayout rl;
	private Context mContext;
	@Override
	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);
		findView();
		mData = getData();
		adapter = new MyAdapter(this);
		lv.setAdapter(adapter);
	}
	
	private void findView(){
		lv = (ListView)findViewById(R.id.lv);
		ll = (LinearLayout)findViewById(R.id.ll);
		rl = (RelativeLayout)findViewById(R.id.rl);
		mContext = this;
	}

	private ArrayList<ListItemInf> getData() {
		ArrayList<ListItemInf> list = new ArrayList<ListItemInf>();
		ListItemInf map = new ListItemInf();
        for(int i=0;i<8;i++){
    	map = new ListItemInf();
		map.cImg = R.drawable.aa;
		list.add(map);

		map = new ListItemInf();
		map.cImg = R.drawable.bb;
		list.add(map);

		map = new ListItemInf();
		map.cImg = R.drawable.cc;
		list.add(map);
        }
		return list;
	
	}


	public final class ViewHolder {
		public ImageView img;
	}

	public class MyAdapter extends BaseAdapter {

		private LayoutInflater mInflater;

		public MyAdapter(Context context) {
			this.mInflater = LayoutInflater.from(context);
		}

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return mData.size();
		}

		@Override
		public Object getItem(int arg0) {
			// TODO Auto-generated method stub
			return null;
		}

		@Override
		public long getItemId(int arg0) {
			// TODO Auto-generated method stub
			return 0;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {

			ViewHolder holder = null;
			if (convertView == null) {
				holder = new ViewHolder();
				convertView = mInflater.inflate(R.layout.vlist2, null);
				holder.img = (ImageView) convertView.findViewById(R.id.img);
				
				convertView.setTag(holder);

			} else {

				holder = (ViewHolder) convertView.getTag();
			}
			
			holder.img.setImageResource((Integer) mData.get(position).cImg);
			holder.img.setOnTouchListener(new OnTouchListener() {
				
				@Override
				public boolean onTouch(View v, MotionEvent event) {
					if(event.getAction()==MotionEvent.ACTION_DOWN && !isClick){
						isClick = true;
						int x = (int)event.getX();
						int y = (int)event.getY();
						
						
						//得到左上角的坐标
						int pointX = (int)(event.getRawX() - x);
						final int pointY = (int)(event.getRawY() - y);
						
						
						
						System.out.println(pointX+"   "+pointY);
						LayoutParams params2 = new LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
						params2.topMargin = pointY;
						//params2.leftMargin = pointX;
						params2.width = v.getWidth();
						params2.height = v.getHeight();
						final ImageView iv = new ImageView(mContext);
						v.setDrawingCacheEnabled(true);
						final Bitmap bitmap = v.getDrawingCache();
						iv.setImageBitmap(bitmap);
						rl.addView(iv, params2);
						
						
						DisplayMetrics metric = new DisplayMetrics();
				        getWindowManager().getDefaultDisplay().getMetrics(metric);
				        int width = metric.widthPixels;  // 屏幕宽度(像素)
				        int height = metric.heightPixels;  // 屏幕高度(像素)
						System.out.println(width+"*"+height);
						
						Animation b = AnimationUtils.loadAnimation(MainActivity.this, R.anim.bg_zoomout);
						AnimationSet as = new AnimationSet(true);
						TranslateAnimation ta = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0, Animation.ABSOLUTE, 90, Animation.RELATIVE_TO_SELF, 0, Animation.ABSOLUTE, 200 - pointY);
						ta.setDuration(2000);
						//以左上角为原点放大
						ScaleAnimation sa = new ScaleAnimation(1,2f,1,2f,
								 Animation.ABSOLUTE,90,   
							      Animation.ABSOLUTE,200 - pointY);
					    sa.setDuration(2000);
					    sa.setFillAfter(true); //让其保持动画结束时的状态。
					    as.addAnimation(ta);
					    as.addAnimation(sa);
					    as.setFillAfter(true);
						iv.startAnimation(as);
						ll.setBackgroundColor(Color.BLACK);
						ll.startAnimation(b);
						
						
						
						final LayoutParams params3 = new LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
						params3.topMargin = 200;
						params3.leftMargin = 90;
						params3.width = v.getWidth()*2;
						params3.height = v.getHeight()*2;
						as.setAnimationListener(new AnimationListener() {
							
							@Override
							public void onAnimationStart(Animation animation) {
								// TODO Auto-generated method stub
								
							}
							
							@Override
							public void onAnimationRepeat(Animation animation) {
								// TODO Auto-generated method stub
								
							}
							
							@Override
							public void onAnimationEnd(Animation animation) {
								
								final ImageView iv2 = new ImageView(mContext);
								iv2.setImageBitmap(bitmap);
								iv2.setOnClickListener(new OnClickListener() {
									
									@Override
									public void onClick(View v) {
										isClick = false;
										Animation b = AnimationUtils.loadAnimation(MainActivity.this, R.anim.bg_zoomin);
										
										AnimationSet as = new AnimationSet(true);
										TranslateAnimation ta = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0, Animation.ABSOLUTE, 0 - 90, Animation.RELATIVE_TO_SELF, 0, Animation.ABSOLUTE, pointY-200);
										ta.setDuration(2000);
										//以左上角为原点放大
										ScaleAnimation sa = new ScaleAnimation(1,0.5f,1,0.5f,
												 Animation.ABSOLUTE,0-90,   
											      Animation.ABSOLUTE,pointY-200);
									    sa.setDuration(2000);
									    sa.setFillAfter(true); //让其保持动画结束时的状态。
									    as.addAnimation(ta);
									    as.addAnimation(sa);
									    as.setFillAfter(true);
										
										iv2.startAnimation(as);
										ll.startAnimation(b);
										
										as.setAnimationListener(new AnimationListener() {

											@Override
											public void onAnimationStart(Animation animation) {
												// TODO Auto-generated method stub
												
											}

											@Override
											public void onAnimationRepeat(Animation animation) {
												// TODO Auto-generated method stub

											}

											@Override
											public void onAnimationEnd(Animation animation) {
												// TODO Auto-generated method stub
												rl.removeView(iv2);
												ll.setBackgroundColor(Color.TRANSPARENT);
											}
										});
										
									}
								});
								rl.removeView(iv);
								rl.addView(iv2, params3);
							}
						});
						
					}
					return false;
				}
			});
			return convertView;
		}
		
	}

}


注意一个非常重要的问题:

AnimationSet只能并行,不能串行  所以会导致动画运行后的结果和我们想要得到的结果不一样  这里有个地方需要注意


ScaleAnimation的中心点 一定要和TranslateAnimationid移动的x y值一样

例如:
TranslateAnimation ta = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0, Animation.ABSOLUTE, 90, Animation.RELATIVE_TO_SELF, 0, Animation.ABSOLUTE, 200 - pointY);
ScaleAnimation sa = new ScaleAnimation(1,2f,1,2f,Animation.ABSOLUTE,90,Animation.ABSOLUTE,200 - pointY);


listview效果:


放大中:



放大后:



缩小中:





代码见附件:





  • 大小: 70.8 KB
  • 大小: 46.3 KB
  • 大小: 26.1 KB
  • 大小: 49.5 KB
分享到:
评论

相关推荐

    2011.09.30——— android ImageView放大缩小

    标题“2011.09.30——— android ImageView放大缩小”涉及到的是Android开发中的一个关键组件ImageView的使用技巧,尤其是关于图像缩放的功能。在Android应用开发中,ImageView是展示图片的常用控件,它允许我们加载...

    2011.09.27(2)——— android ImageView上下同时拉伸的效果

    这篇2011年的博客文章"2011.09.27(2)——— android ImageView上下同时拉伸的效果"探讨了如何实现一个自定义的ImageView,使得图像在垂直方向上能够同时在顶部和底部进行拉伸,以达到特定的视觉效果。这种效果通常...

    2011.10.19(2)——— android 圆角与倒影

    &lt;corners android:radius="10dp"/&gt; &lt;!-- 圆角半径 --&gt; ``` 你可以将这个XML文件放入res/drawable目录下,并设置为你的View或ImageView的背景。`android:radius`属性用于指定圆角的半径,单位是像素。 另一种方法...

    2011.09.21——— android 动态壁纸开发

    2011.09.21的这篇博客文章深入探讨了如何开发Android动态壁纸,提供了宝贵的实践经验和源码示例。 一、动态壁纸基础 动态壁纸在Android系统中是通过`LiveWallpaper`服务实现的,它继承自`WallpaperService`类。...

    android图片放大缩小 ImageView

    9. **动画效果**: 除了静态的放大缩小,还可以通过Animation类或ObjectAnimator实现平滑的缩放动画效果,增强用户体验。 10. **性能考量**: 当处理大量图片或高分辨率图片时,要注意内存管理,合理使用Bitmap的配置...

    2011.08.26——— android ListView之多个item布局

    这篇博客"2011.08.26——— android ListView之多个item布局"深入探讨了如何在ListView中实现多个不同类型的Item布局,这对于创建动态、丰富的用户界面至关重要。在Android应用设计中,ListView通常用于显示如联系人...

    android自定义imageview实现放大缩小

    以上就是使用自定义ImageView实现图片放大缩小的基本步骤和关键代码。通过这种方式,我们可以构建一个高度定制且高效的图片查看器组件,适用于各种Android应用程序。在项目中使用时,只需将`MyImage`类导入并替换...

    安卓Android源码——imageView.rar

    这个`Android源码——imageView.rar`压缩包可能包含了`ImageView`类的源代码,让我们来深入探讨一下`ImageView`及其相关的知识点。 一、`ImageView`概述 `ImageView`是Android SDK中的一个视图类,它继承自`View`或...

    Android ImageView图片放大到全屏显示

    imageView.getLayoutParams().width = width; imageView.getLayoutParams().height = height; ``` 然后,为了实现局部拉伸放大,我们可以自定义一个ImageView子类,重写其`onTouchEvent()`方法,监听用户的触摸事件...

    2014.01.07 ——— android开发实例之QuickActionBar

    这篇2014年的博客文章“2014.01.07 ——— android开发实例之QuickActionBar”可能是探讨如何在Android应用中实现这一功能的教程。 首先,我们要理解QuickActionBar的基本概念。它是一个自定义控件,用于替代或扩展...

    Android自定义ImageView实现自动放大缩小动画

    Android自定义ImageView实现自动放大缩小动画 Android自定义ImageView实现自动放大缩小动画是Android开发中常见的一种需求,主要用于实现图片的自动放大缩小动画效果。在这篇文章中,我们将详细介绍如何使用...

    android 自定义imageview(手势放大,缩小,旋转)

    本文将深入探讨如何基于Android的ImageView组件创建一个自定义视图,实现手势操作,包括图像的放大、缩小和旋转功能。 首先,我们需要了解Android的手势检测机制。Android提供了GestureDetector和...

    Android源码——ImageView图片循环跑马灯效果源码_new_08.7z

    此项目“Android源码——ImageView图片循环跑马灯效果源码_new_08.7z”提供了这样的实现示例。下面我们将深入探讨这个效果的实现原理及其相关知识点。 1. **图片资源**: 压缩包中的1-121111112H50-L.png和1_...

    Android通过ImageView实现图片的显示和切换

    imageView.setImageResource(imageArray[currentIndex]); } }); nextButton.setOnClickListener(v -&gt; { if (currentIndex &lt; imageArray.length - 1) { currentIndex++; imageView.setImageResource(imageArray...

    Imageview通过手势放大缩小拖拽

    本DEMO“Imageview通过手势放大缩小拖拽”就是为了解决这个问题,它通过继承`ImageView`并重写相关方法来实现手势操作。 1. **手势识别** - `GestureDetector`: 这个类是Android提供的用于识别简单手势的工具,如...

    jQuery图像放大插件jQuery.imageView

    4. **事件监听**:可以监听插件提供的事件,比如`imageView.show`和`imageView.hide`,以便在放大镜显示和隐藏时执行相应操作。 ### 示例代码 ```html &lt;!DOCTYPE html&gt; &lt;title&gt;jQuery.imageView示例 ...

    安卓Android源码——android相册系统(用Matrix实现).rar

    这个压缩包“安卓Android源码——android相册系统(用Matrix实现).rar”显然提供了一个使用Matrix类来实现相册功能的示例代码。Matrix是Android SDK中的一个关键类,用于进行2D图像变换,如旋转、缩放、平移等。接...

    Android代码-SimpleTagImageView

    So it's a ImageView. Demo Warning:When you set the round radius,the simpletagimageview scale type just support fitXY now! Usage Quick Start Gradle compile '...

    安卓Android源码——gesture-imageview.zip

    在这个"Android源码——gesture-imageview.zip"项目中,我们主要探讨的是如何将手势识别功能集成到ImageView组件中,创建一个自定义的GestureImageView。这个源码示例旨在帮助开发者了解如何实现手势操作,如缩放、...

Global site tag (gtag.js) - Google Analytics