`
flyingsir_zw
  • 浏览: 12449 次
文章分类
社区版块
存档分类
最新评论

自定义Gallery 滑动中图片自动突出显示

阅读更多
package org.pskink;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Matrix;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.AdapterView;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.AdapterView.OnItemSelectedListener;

public class AnimatedSizingGallery extends Gallery implements OnItemSelectedListener {
	public static final String TAG = "AnimatedSizingGallery";
	private static final int MSG_ZOOM_IN = 1;
	private  static final long DELAY = 100;

	private View mPrev;
	private float mAnimationScale;
	private float mAnimationOffsetY;
	private int mAnimationDuration;
	
	public AnimatedSizingGallery(Context context, AttributeSet attrs) {
		super(context, attrs);
		TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.AnimatedSizingGallery);
		mAnimationScale = a.getFloat(R.styleable.AnimatedSizingGallery_animationScale, 2);
		mAnimationOffsetY = a.getFloat(R.styleable.AnimatedSizingGallery_animationOffsetY, 0);
		mAnimationDuration = a.getInteger(R.styleable.AnimatedSizingGallery_animationDuration, 500);
		a.recycle();
		setOnItemSelectedListener(this);
	}

	public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
		if (mPrev != null) {
			zoomOut();
		}
		mPrev = view;
		mGalleryHandler.removeCallbacksAndMessages(view);
		Message msg = Message.obtain(mGalleryHandler, MSG_ZOOM_IN, view);
		mGalleryHandler.sendMessageDelayed(msg, DELAY);
	}

	public void onNothingSelected(AdapterView<?> parent) {
		Log.d(TAG, "onNothingSelected called !!!");
		if (mPrev != null) {
			zoomOut();
			mPrev = null;
		}
	}
	
	private void zoomOut() {
		if (mGalleryHandler.hasMessages(MSG_ZOOM_IN, mPrev)) {
			mGalleryHandler.removeCallbacksAndMessages(mPrev);
		} else {
			ZoomAnimation a = (ZoomAnimation) mPrev.getAnimation();
			a.resetForZoomOut();
			mPrev.startAnimation(a);
		}
	}

	Handler mGalleryHandler = new Handler() {
		@Override
		public void dispatchMessage(Message msg) {
			if (msg.what == MSG_ZOOM_IN) {
				ImageView view = (ImageView) msg.obj;
				Animation a = new ZoomAnimation(view, 1, mAnimationScale, mAnimationOffsetY, mAnimationDuration);
				view.startAnimation(a);
			}
		}
	};

	class ZoomAnimation extends Animation {
		private float mFrom;
		private float mTo;
		private float mOffsetY;
		private int mPivotX;
		private int mPivotY;
		private float mInterpolatedTime;

		public ZoomAnimation(View v, float from, float to, float offsetY, int duration) {
			super();
			mFrom = from;
			mTo = to;
			mOffsetY = offsetY * v.getHeight();
			setDuration(duration);
			setFillAfter(true);
			mPivotX = v.getWidth() / 2;
			mPivotY = v.getHeight() / 2;
		}
		
		public void resetForZoomOut() {
			reset();
			mOffsetY = 0;
			mFrom = mFrom + (mTo - mFrom) * mInterpolatedTime;
			mTo = 1;
		}

		@Override
		protected void applyTransformation(float interpolatedTime, Transformation t) {
			mInterpolatedTime = interpolatedTime;
	        float s = mFrom + (mTo - mFrom) * interpolatedTime;
	        Matrix matrix = t.getMatrix();
	        if (mOffsetY != 0) {
	        	matrix.preTranslate(0, mOffsetY * interpolatedTime);
	        }
	        if (mTo == 1) {
	        	matrix.preRotate(360 * interpolatedTime, mPivotX, mPivotY);
	        }
            matrix.preScale(s, s, mPivotX, mPivotY);
		}
	}
}
分享到:
评论

相关推荐

    android 左右滑动加索引

    3. 在`getView()`中,可以通过比较当前位置的首字母和索引列表中的元素来确定是否匹配,如果匹配,则改变该索引的样式以突出显示。 4. 最后,将这个自定义的`Adapter`设置给`Gallery`,通过`setAdapter()`方法。 **...

    Android利用Gallery和ImageSwitcher实现在线相册图片预览功能(异步加载图片).zip

    3. **焦点管理**:`Gallery`会自动处理焦点,当前选中的项会获得焦点并突出显示。 `ImageSwitcher`则是一个用于快速切换图片的视图,它继承自`ViewSwitcher`,专门设计用来在两个`View`之间进行平滑过渡。`...

    Android Gallery2

    3. **选中项高亮**:Gallery2有选中状态的概念,可以通过设置选中项的背景或者颜色来突出显示当前选中的图片。当用户滑动时,选中项会随着滑动改变。 4. **数据绑定**:Gallery2通常与Adapter一起使用,Adapter负责...

    Android HorizontalScrollView实现横向Gallery

    虽然HorizontalScrollView没有内置 Gallery的许多高级特性,如自动轮播、动画效果等,但结合其他组件和自定义逻辑,开发者可以定制出满足需求的横向滚动视图。在实际开发中,还应注意性能优化,确保流畅的用户体验。

    jQuery 3D Gallery Room原flickr图库相册特效.rar

    这款插件能够将图片以立体的方式展示在虚拟的画廊空间中,用户可以通过鼠标滚动或触摸滑动来浏览和切换图片,使得网页上的图片展示更加生动和引人入胜。 jQuery是一个轻量级、高性能的JavaScript库,广泛应用于网页...

    带动画效果的jquery画廊-图库图片展示.rar

    在标签“网页素材-焦点图幻灯片”中,"焦点图"通常指的是页面中突出显示的大型图像或一组图像,能够随着用户的操作或时间变化而变化,而"幻灯片"则是一种自动播放的图片展示方式,这两个标签进一步确认了这个图库...

    Nextgen Gallery Wrodpress图片画廊插件

    这对于想要在首页或产品页面上突出显示关键图片的网站来说非常有用。Nextgen Gallery还允许你嵌入视频,将多媒体体验提升到新的层次。 在组织方面,Nextgen Gallery支持分组画廊和子画廊,这样你可以按照项目、主题...

    android控件使用

    2. **焦点机制**:Gallery会自动处理焦点,当用户滚动时,当前选中的项会获得焦点,突出显示。 3. **自定义适配器**:与ListView类似,Gallery也需要一个Adapter来填充数据。开发者可以自定义Adapter来决定每个项目...

    推荐30个新鲜出炉的精美 jQuery 效果

    1. **3D Gallery**: 这是一种创新的图像展示方式,通过三维视角呈现图片,为用户带来更丰富的视觉体验。 2. **Book Transition Pages**: 类似于翻书效果的页面过渡,模拟纸质书页翻动的感觉,增加互动性和趣味性。 3...

    达芬奇界面中英文对照

    - **黑白突出显示**: Black and White Highlight - 以黑白方式突出显示特定内容。 - **显示参考划像**: Show Reference Bars - 显示参考线或标记。 - **参考划像模式**: Reference Bars Mode - 设置参考划像的...

Global site tag (gtag.js) - Google Analytics