Android 创建自定义库
我想创建一个自定义库,其中库中最中间的视图显示缩小动画。因此,当我滚动我的图库时,进入中心的项目将被缩放。所以我需要知道的是:Android 创建自定义库,android,android-gallery,Android,Android Gallery,我想创建一个自定义库,其中库中最中间的视图显示缩小动画。因此,当我滚动我的图库时,进入中心的项目将被缩放。所以我需要知道的是: 如何在图库中找到中心项目(如果显示5个项目,我需要第3个项目作为中心项目) 当滚动发生时,如何设置动画以获得平滑的凸起效果 借助一种使用队列的管道结构,结合Gallery的addViewToLayout方法,我得到了它 代码: 自定义图库类 public class NGallery extends Gallery { private Pipe<View>
借助一种使用队列的管道结构,结合Gallery的addViewToLayout方法,我得到了它 代码: 自定义图库类
public class NGallery extends Gallery {
private Pipe<View> childViews;
private int pipeSize;
private View previousAnimatedView;
private boolean isScrollLeft;
public NGallery(Context context, AttributeSet attrs) {
super(context, attrs);
final Timer tmr = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
initialize();
if (pipeSize > 0) {
tmr.cancel();
}
}
};
tmr.scheduleAtFixedRate(task, 100, 100);
}
private void initialize() {
View childView = getChildAt(0);
if (childView != null && childView.getWidth() > 0) {
pipeSize = getWidth() / childView.getWidth();
childViews = new Pipe<View>(pipeSize);
}
}
@Override
protected boolean addViewInLayout(View child, int index,
android.view.ViewGroup.LayoutParams params,
boolean preventRequestLayout) {
View viewToAnimate = getViewToAnimate(child);
if (viewToAnimate != null) {
if (previousAnimatedView != null) {
previousAnimatedView.clearAnimation();
}
viewToAnimate.requestFocus();
AnimationSet animationSet = getAnimationSet(viewToAnimate);
viewToAnimate.startAnimation(animationSet);
previousAnimatedView = viewToAnimate;
}
return super
.addViewInLayout(child, index, params, preventRequestLayout);
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
isScrollLeft = distanceX > 0;
return super.onScroll(e1, e2, distanceX, distanceY);
}
private AnimationSet getAnimationSet(View viewToAnimate) {
AnimationSet animationSet = new AnimationSet(false);
Animation scaleAnimation = new ScaleAnimation(1, 1.5f, 1, 1.5f);
scaleAnimation.setDuration(100);
animationSet.addAnimation(scaleAnimation);
Animation transAnimation = new TranslateAnimation(0, 0, 0, 25);
transAnimation.setDuration(100);
animationSet.addAnimation(transAnimation);
animationSet.setFillAfter(true);
return animationSet;
}
private View getViewToAnimate(View child) {
if (childViews != null) {
if (isScrollLeft) {
childViews.addFirst(child);
} else {
childViews.addLast(child);
}
return childViews.getCenterItem();
} else {
return null;
}
}
}
公共类NGallery扩展库{
私人管道儿童视图;
专用int管道尺寸;
私有视图先前的动画视图;
私有布尔IsCrollleft;
公共NGallery(上下文、属性集属性){
超级(上下文,attrs);
最终定时器tmr=新定时器();
TimerTask任务=新的TimerTask(){
@凌驾
公开募捐{
初始化();
如果(管道大小>0){
tmr.cancel();
}
}
};
tmr.scheduleAtFixedRate(任务,100100);
}
私有void初始化(){
View childView=getChildAt(0);
if(childView!=null&&childView.getWidth()>0){
pipeSize=getWidth()/childView.getWidth();
子视图=新管道(管道尺寸);
}
}
@凌驾
受保护的布尔addViewInLayout(视图子级、int索引、,
android.view.ViewGroup.LayoutParams参数,
布尔值(布局){
View viewToAnimate=getViewToAnimate(子级);
if(viewToAnimate!=null){
如果(以前的AnimatedView!=null){
previousAnimatedView.clearAnimation();
}
viewToAnimate.requestFocus();
AnimationSet AnimationSet=getAnimationSet(viewToAnimate);
viewToAnimate.startAnimation(动画集);
previousAnimatedView=viewToAnimate;
}
返回超级
.addViewInLayout(子级、索引、参数、布局);
}
@凌驾
公共布尔onScroll(MotionEvent e1、MotionEvent e2、浮点距离X、,
浮动距离){
isScrollLeft=距离X>0;
返回super.onScroll(e1,e2,distanceX,distanceY);
}
私有动画集getAnimationSet(查看视图到动画){
AnimationSet AnimationSet=新的AnimationSet(false);
动画缩放动画=新缩放动画(1,1.5f,1,1.5f);
scaleAnimation.setDuration(100);
animationSet.addAnimation(缩放动画);
动画转换动画=新的转换动画(0,0,0,25);
转氨酶。设定持续时间(100);
animationSet.addAnimation(动画转换);
animationSet.setFillAfter(true);
返回动画集;
}
私有视图getViewToAnimate(视图子级){
if(childview!=null){
如果(isScrollLeft){
childview.addFirst(child);
}否则{
childview.addLast(child);
}
返回childview.getCenterItem();
}否则{
返回null;
}
}
}
管道等级:
public class Pipe<E> {
private LinkedList<E> list;
private int pipeSize;
public Pipe(int size) {
list = new LinkedList<E>();
pipeSize = size;
}
public E getItemAt(int position) {
return list.get(position);
}
public E getCenterItem() {
int pos = pipeSize / 2;
if (pos < list.size()) {
return list.get(pos);
} else {
return null;
}
}
public void addFirst(E item) {
if (list.size() >= pipeSize) {
list.removeLast();
}
list.addFirst(item);
}
public void addLast(E item) {
if (list.size() >= pipeSize) {
list.removeFirst();
}
list.addLast(item);
}
}
公共类管道{
私有链接列表;
专用int管道尺寸;
公共管道(内部尺寸){
列表=新的LinkedList();
管道尺寸=尺寸;
}
公共E getItemAt(内部位置){
返回列表。获取(位置);
}
公共E getCenterItem(){
int pos=管道尺寸/2;
如果(位置=pipeSize){
list.removeLast();
}
列表。添加第一个(项目);
}
公共无效添加最后一项(E项){
if(list.size()>=pipeSize){
list.removeFirst();
}
列表。添加最后一个(项目);
}
}