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

本文介绍了一个名为 AnimatedSizingGallery 的自定义 Android Gallery 控件,它可以在选择项切换时动态调整图片大小,提供了 zoom in 和 zoom out 的动画效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
}
}
}

附件:http://files.cnblogs.com/shanzei/Gallery.zip

转自:http://flyingsir-zw.iteye.com/blog/1456523

转载于:https://www.cnblogs.com/shanzei/archive/2012/03/24/2415642.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值