Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 创建自定义库_Android_Android Gallery - Fatal编程技术网

Android 创建自定义库

Android 创建自定义库,android,android-gallery,Android,Android Gallery,我想创建一个自定义库,其中库中最中间的视图显示缩小动画。因此,当我滚动我的图库时,进入中心的项目将被缩放。所以我需要知道的是: 如何在图库中找到中心项目(如果显示5个项目,我需要第3个项目作为中心项目) 当滚动发生时,如何设置动画以获得平滑的凸起效果 借助一种使用队列的管道结构,结合Gallery的addViewToLayout方法,我得到了它 代码: 自定义图库类 public class NGallery extends Gallery { private Pipe<View>

我想创建一个自定义库,其中库中最中间的视图显示缩小动画。因此,当我滚动我的图库时,进入中心的项目将被缩放。所以我需要知道的是:

  • 如何在图库中找到中心项目(如果显示5个项目,我需要第3个项目作为中心项目)
  • 当滚动发生时,如何设置动画以获得平滑的凸起效果

  • 借助一种使用队列的管道结构,结合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();
    }
    列表。添加最后一个(项目);
    }
    }