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放大缩小”涉及到的是Android开发中的一个关键组件ImageView的使用技巧,尤其是关于图像缩放的功能。在Android应用开发中,ImageView是展示图片的常用控件,它允许我们加载...
这篇2011年的博客文章"2011.09.27(2)——— android ImageView上下同时拉伸的效果"探讨了如何实现一个自定义的ImageView,使得图像在垂直方向上能够同时在顶部和底部进行拉伸,以达到特定的视觉效果。这种效果通常...
<corners android:radius="10dp"/> <!-- 圆角半径 --> ``` 你可以将这个XML文件放入res/drawable目录下,并设置为你的View或ImageView的背景。`android:radius`属性用于指定圆角的半径,单位是像素。 另一种方法...
2011.09.21的这篇博客文章深入探讨了如何开发Android动态壁纸,提供了宝贵的实践经验和源码示例。 一、动态壁纸基础 动态壁纸在Android系统中是通过`LiveWallpaper`服务实现的,它继承自`WallpaperService`类。...
9. **动画效果**: 除了静态的放大缩小,还可以通过Animation类或ObjectAnimator实现平滑的缩放动画效果,增强用户体验。 10. **性能考量**: 当处理大量图片或高分辨率图片时,要注意内存管理,合理使用Bitmap的配置...
这篇博客"2011.08.26——— android ListView之多个item布局"深入探讨了如何在ListView中实现多个不同类型的Item布局,这对于创建动态、丰富的用户界面至关重要。在Android应用设计中,ListView通常用于显示如联系人...
以上就是使用自定义ImageView实现图片放大缩小的基本步骤和关键代码。通过这种方式,我们可以构建一个高度定制且高效的图片查看器组件,适用于各种Android应用程序。在项目中使用时,只需将`MyImage`类导入并替换...
这个`Android源码——imageView.rar`压缩包可能包含了`ImageView`类的源代码,让我们来深入探讨一下`ImageView`及其相关的知识点。 一、`ImageView`概述 `ImageView`是Android SDK中的一个视图类,它继承自`View`或...
imageView.getLayoutParams().width = width; imageView.getLayoutParams().height = height; ``` 然后,为了实现局部拉伸放大,我们可以自定义一个ImageView子类,重写其`onTouchEvent()`方法,监听用户的触摸事件...
这篇2014年的博客文章“2014.01.07 ——— android开发实例之QuickActionBar”可能是探讨如何在Android应用中实现这一功能的教程。 首先,我们要理解QuickActionBar的基本概念。它是一个自定义控件,用于替代或扩展...
Android自定义ImageView实现自动放大缩小动画 Android自定义ImageView实现自动放大缩小动画是Android开发中常见的一种需求,主要用于实现图片的自动放大缩小动画效果。在这篇文章中,我们将详细介绍如何使用...
本文将深入探讨如何基于Android的ImageView组件创建一个自定义视图,实现手势操作,包括图像的放大、缩小和旋转功能。 首先,我们需要了解Android的手势检测机制。Android提供了GestureDetector和...
此项目“Android源码——ImageView图片循环跑马灯效果源码_new_08.7z”提供了这样的实现示例。下面我们将深入探讨这个效果的实现原理及其相关知识点。 1. **图片资源**: 压缩包中的1-121111112H50-L.png和1_...
imageView.setImageResource(imageArray[currentIndex]); } }); nextButton.setOnClickListener(v -> { if (currentIndex < imageArray.length - 1) { currentIndex++; imageView.setImageResource(imageArray...
本DEMO“Imageview通过手势放大缩小拖拽”就是为了解决这个问题,它通过继承`ImageView`并重写相关方法来实现手势操作。 1. **手势识别** - `GestureDetector`: 这个类是Android提供的用于识别简单手势的工具,如...
4. **事件监听**:可以监听插件提供的事件,比如`imageView.show`和`imageView.hide`,以便在放大镜显示和隐藏时执行相应操作。 ### 示例代码 ```html <!DOCTYPE html> <title>jQuery.imageView示例 ...
这个压缩包“安卓Android源码——android相册系统(用Matrix实现).rar”显然提供了一个使用Matrix类来实现相册功能的示例代码。Matrix是Android SDK中的一个关键类,用于进行2D图像变换,如旋转、缩放、平移等。接...
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"项目中,我们主要探讨的是如何将手势识别功能集成到ImageView组件中,创建一个自定义的GestureImageView。这个源码示例旨在帮助开发者了解如何实现手势操作,如缩放、...