zoukankan      html  css  js  c++  java
  • gallery左右滑动时图片淡入淡出

    前几天,公司项目有一个功能要做成滑动图片的淡入淡出,要一边滑动一边改变,所以ViewFlipper左右滑动效果就不能了。网上找了很久,也找不到资料,所以自己写了一个,通过滑动改变imageView的透明度。当按下图片时,先记下imageView的位置,图片滑动时,位置发生变化,就可以算出移动的距离,从而可以算出alpha的值。当图片向左滑动时,设置imageView的Alpha即imageView.setAlpha(255-alpha),设置下一个nextView的Alpha即nextView.setAlpha(alpha);当图片向右滑动时,设置imageView的Alpha即imageView.setAlpha(255-alpha),设置上一个lastView的Alpha即lastView.setAlpha(alpha);效果如图所示

          

    废话就不多说了,上代码哈

    package com.gallery.gradient;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.KeyEvent;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.WindowManager;
    import android.widget.BaseAdapter;
    import android.widget.Gallery;
    import android.widget.ImageView;
    
    public class MyGallery extends Gallery {
    
        private ImageAdapter adapter;
        private int position ;
        private ImageView imageView;
        private int[] viewLocation;
        private ImageView nextView;
        private ImageView lastView;
        private int winWeight;
        private Context context;
        
        public MyGallery(Context context, AttributeSet attrs) {
            super(context, attrs);
            this.context = context;
        }
    
        public MyGallery(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            this.context = context;
        }
    
        public MyGallery(Context context, int[] residList) {
            super(context);
            this.context = context;
            adapter = new ImageAdapter(context, residList);
            setAdapter(adapter);
        }
    
        
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                position = getSelectedItemPosition();
                imageView = (ImageView) findViewWithTag(position);
                viewLocation = new int[2];
                imageView.getLocationInWindow(viewLocation);
                WindowManager wm = (WindowManager) context.getApplicationContext().getSystemService(
                        Context.WINDOW_SERVICE);
                winWeight = wm.getDefaultDisplay().getWidth();
                break;
            case MotionEvent.ACTION_MOVE:
                
                break;
            case MotionEvent.ACTION_UP:
    //            int position = getSelectedItemPosition();
    //            ImageView imageView = (ImageView) findViewWithTag(position);
    //            if (imageView != null) {
    //                System.out.println("imageView");
    //                imageView.setAlpha(255);
    //                int[] location = new int[2];
    //                imageView.getLocationInWindow(location);
    //            }
                break;
    
            default:
                break;
            }
            
            return super.onTouchEvent(event);
        }
        
    //    @Override
    //    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
    //            float distanceY) {
    //        if (e1.getX() > e2.getX()) {
    //            lastView = (ImageView) findViewWithTag(position+1);
    //        }else {
    //            nextView = (ImageView) findViewWithTag(position-1);
    //        }
    //        
    //        
    //        return super.onScroll(e1, e2, distanceX, distanceY);
    //    }
        
        @Override
        protected void onScrollChanged(int l, int t, int oldl, int oldt) {
            super.onScrollChanged(l, t, oldl, oldt);
            int[] location = new int[2];
            imageView.getLocationInWindow(location);
            
            if (location[0] != 0) {
                if (location[0] > viewLocation[0]) {
                    int alpha = location[0] - viewLocation[0];
                    alpha = alpha * 255 / winWeight;
                    imageView.setAlpha(255-alpha);
                    lastView = (ImageView) findViewWithTag(position-1);
                    if (lastView != null) {
                        lastView.setAlpha((alpha));
                    }
                }else {
                    int alpha = viewLocation[0] - location[0];
                    alpha = alpha * 255 / winWeight;
                    imageView.setAlpha(255-alpha);
                    nextView = (ImageView) findViewWithTag(position+1);
                    if (nextView != null) {
                        nextView.setAlpha(alpha);
                    }
                }
            }
            if (location[0] == 0) {
                if (lastView != null) {
                    lastView.setAlpha((255));
                }
                if (nextView != null) {
                    nextView.setAlpha(255);
                }
            }
        }
        
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
    
                float velocityY) {
            int kEvent;
            if(isScrollingLeft(e1, e2)){ //Check if scrolling left
              kEvent = KeyEvent.KEYCODE_DPAD_LEFT;
            }
            else{ //Otherwise scrolling right
              kEvent = KeyEvent.KEYCODE_DPAD_RIGHT;
            }
            onKeyDown(kEvent, null);
            return true; 
        }
        
         private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2){
                return e2.getX() > e1.getX();
            }
         
         public class ImageAdapter extends BaseAdapter {
                private Context mcontext;
                private int[] residList;
    
                public ImageAdapter(Context context, int[] residList) {
                    this.residList = residList;
                    mcontext = context;
                }
    
                @Override
                public int getCount() {
                    return residList.length;
                }
    
                @Override
                public Object getItem(int position) {
                    return residList[position];
                }
    
                @Override
                public long getItemId(int position) {
                    return position;
                }
    
                public int getResId(int position) {
                    return residList[position];
                }
    
                @Override
                public View getView(int position, View convertView, ViewGroup parent) {
                    ImageView img;
                    if (convertView == null) {
                        img = new ImageView(mcontext);
                        img.setScaleType(ImageView.ScaleType.FIT_XY);
                        img.setLayoutParams(new Gallery.LayoutParams(-1, -1));
                        
                    } else {
                        img = (ImageView) convertView;
                    }
                    img.setTag(position);
                    img.setImageResource(residList[position]);
                    return img;
                }
                
         }
    }

    代码下载链接 http://pan.baidu.com/s/1hqxaYTu

  • 相关阅读:
    这一次,Google 终于对 Web 自动化下手了!
    移动端自动化 AutoJS 快速入门指南
    App 端自动化的最佳方案,完全解放双手!
    快过年了,如何使用 AutoJS 自动化快速抢微信红包!
    字节面试问我如何高效设计一个LRU,当场懵
    当前大厂笔试最高频的十道算法题
    coding game, 边打游戏边学编程,是一种怎么样的体验?
    一文详解面试常考的TopK问题
    动态规划,这几个问题最常见!
    备战蓝桥杯,你可以这么准备
  • 原文地址:https://www.cnblogs.com/ycclmy/p/3721901.html
Copyright © 2011-2022 走看看