Androidカスタムキャストマップ

51551 ワード

ローテーションアドレス
概要
  • レイアウトを書きます.その中にはViewPager、TextView、LinearLayoutがあります.
  • ViewPager:ピクチャ
  • を担持するための
  • TextView:テキスト記述
  • を表示するために使用される
  • LinearLayout:インジケータ
  • を表示
  • はConstraintLayoutをカスタマイズする、このコントロールでページ切替ロジックなどを処理する.

  • ぶんせき
  • カスタム属性の取得およびいくつかの属性の設定
  • public BannerY(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView(context);
        initXmlParams(context, attrs, defStyleAttr);
        fixParams();
        initListener();
        initLists();
        initImageLoader();
    }
    /**
     *    ImageLoader
     */
    private void initImageLoader() {
        ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(mContext));
    }
    /**
     *       BannerY,  VP,TextView,LinearLayout  
     *
     * @param context
     */
    private void initView(Context context) {
        mContext = context;
        LayoutInflater.from(context).inflate(R.layout.layout_banner, this);
        mVp = (ViewPager) findViewById(R.id.vp);
        mTvDesc = (TextView) findViewById(R.id.tv_desc);
        mLLPoint = (LinearLayout) findViewById(R.id.ll_point);
    }
    /**
     *        
     *
     * @param context
     * @param attrs
     * @param defStyleAttr
     */
    private void initXmlParams(Context context, AttributeSet attrs, int defStyleAttr) {
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.BannerY, defStyleAttr, 0);
        mPointSize = typedArray.getDimensionPixelSize(R.styleable.BannerY_point_size, 8);
        mPointBG = typedArray.getResourceId(R.styleable.BannerY_point_bg, R.drawable.point_selector);
        mInterval = typedArray.getInteger(R.styleable.BannerY_banner_interval, 2000);
        mTvBottomMargin = typedArray.getDimensionPixelSize(R.styleable.BannerY_desc_bottom_margin, 8);
        mPointBottomMargin = typedArray.getDimensionPixelSize(R.styleable.BannerY_point_bottom_margin, 8);
        mDescColor = typedArray.getColor(R.styleable.BannerY_desc_color, Color.BLACK);
        mDescSize = typedArray.getDimensionPixelSize(R.styleable.BannerY_desc_size, 14);
        mScaleType = typedArray.getInt(R.styleable.BannerY_banner_scaletype, -1);
        typedArray.recycle();
    }
    /**
     *                    
     */
    private void fixParams() {
        //    
        LayoutParams mTvDescLayoutParams = (LayoutParams) mTvDesc.getLayoutParams();
        mTvDescLayoutParams.bottomMargin = (int) mTvBottomMargin;
        mTvDesc.setLayoutParams(mTvDescLayoutParams);
        mTvDesc.setTextColor(mDescColor);
        mTvDesc.getPaint().setTextSize(mDescSize);
        //   
        LayoutParams mLLPointLayoutParams = (LayoutParams) mLLPoint.getLayoutParams();
        mLLPointLayoutParams.bottomMargin = (int) mPointBottomMargin;
        mLLPoint.setLayoutParams(mLLPointLayoutParams);
    }
    /**
     *            Handler  
     */
    @SuppressLint("HandlerLeak")
    private void initLists() {
        mImageViewList = new ArrayList<>();
        mDescList = new ArrayList<>();
        mHandler = new Handler(Looper.getMainLooper()) {
            @Override
            public void handleMessage(@NonNull Message msg) {
                super.handleMessage(msg);
                //   ViewPager          
                int currentItem = mVp.getCurrentItem();
                //         
                mVp.setCurrentItem(currentItem + 1);
                //             ,             .
                mHandler.sendEmptyMessageDelayed(1, mInterval);
            }
        };
    }
    /**
     *  ViewPager      
     */
    private void initListener() {
        mVp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }
            @Override
            public void onPageSelected(int position) {
                // ViewPager     Integer.MAX_VALUE   
                // position  ,   mImageViewList     .
                int realPosition = position % mImageViewList.size();
                if (mDescList.size() == mImageViewList.size()) {
                    //                ,        TextView         .
                    String desc = mDescList.get(realPosition);
                    mTvDesc.setText(desc);
                } else {
                    if (BuildConfig.DEBUG) {
                        Log.d(TAG, "              ");
                    }
                }
                //                   
                mLLPoint.getChildAt(prePosition).setEnabled(false);
                //        LinearLayout             ,            ,         .
                mLLPoint.getChildAt(realPosition).setEnabled(true);
                prePosition = realPosition;
            }
            @Override
            public void onPageScrollStateChanged(int state) {
                if (state == ViewPager.SCROLL_STATE_DRAGGING) {//    
                    //     ViewPager,          ,Handler       .
                    isDragging = true;
                    mHandler.removeCallbacksAndMessages(null);
                }
                if (state == ViewPager.SCROLL_STATE_IDLE && isDragging) {//    
                    // ViewPager        ,    Handler    .
                    mHandler.removeCallbacksAndMessages(null);
                    mHandler.sendEmptyMessageDelayed(1, mInterval);
                }
            }
        });
    }
    
  • ピクチャソースセット
  • を設定する.
    /**
     *      
     * @param imagesRes
     * @param 
     */
    public <T> void setImagesRes(ArrayList<T> imagesRes) {
        if (judgeLenght(imagesRes)) {
            mImageViewList.clear();
            //        
            initImageList(imagesRes);
            //   Adapter
            mBannerAdapter = new BannerAdapter(mImageViewList);
            mVp.setAdapter(mBannerAdapter);
            //   ViewPager         ,   ViewPager     Integer.MAX_VALUE( ViewPagerAdapter    ).
            int position = Integer.MAX_VALUE / 2 - Integer.MAX_VALUE / 2 % mImageViewList.size();
            //     ViewPager      
            mVp.setCurrentItem(position);
            //       
            mHandler.sendEmptyMessageDelayed(1, mInterval);
            if (mDescList.size() == mImageViewList.size()) {
                //         
                mTvDesc.setText(mDescList.get(prePosition));
            }
        }
    }
    
    /**
     *        
     */
    private void initImageList(ArrayList imagesRes) {
        Class<?> imageResClass = imagesRes.get(0).getClass();
        for (int i = 0; i < imagesRes.size(); i++) {
            //   ImageView
            ImageView imageView = createImageView(imagesRes, i, imageResClass);
            //  ImageView      
            setImageViewListener(imageView);
            //  ImageView      
            mImageViewList.add(imageView);
            //     
            addPoint(i);
        }
    }
    /**
     *       ImageView  
     *
     * @param imagesRes
     * @param i
     * @param imageResClass
     * @return
     */
    private ImageView createImageView(ArrayList imagesRes, int i, Class<?> imageResClass) {
        ImageView imageView = new ImageView(mContext);
        ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        imageView.setLayoutParams(layoutParams);
        ImageView.ScaleType scaleType = sScaleTypeArray[mScaleType];
        imageView.setScaleType(scaleType);
        if (imageResClass.equals(String.class)) {
            //           url,    
            String url = (String) imagesRes.get(i);
            //   ImageLoader      ImageView 
            ImageLoader.getInstance().displayImage(url, imageView);
        } else if (imageResClass.equals(Integer.class)) {
            //               ID
            Integer resId = (Integer) imagesRes.get(i);
            imageView.setImageResource(resId);
        }
        return imageView;
    }
    
    /**
     *  ImageView             
     *
     * @param imageView
     */
    @SuppressLint("ClickableViewAccessibility")
    private void setImageViewListener(ImageView imageView) {
        imageView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        //     ImageView   ,    handler         
                        mHandler.removeCallbacksAndMessages(null);
                        break;
                    case MotionEvent.ACTION_UP:
                        //      ,          .
                        mHandler.removeCallbacksAndMessages(null);
                        mHandler.sendEmptyMessageDelayed(1, mInterval);
                        break;
                }
                return false;
            }
        });
        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mIClickBanner != null) {
                    //    ImageView ,  getTage()              .
                    //     ViewPagerAdapter  instantiateItem()    .
                    int positon = (int) v.getTag();
                    int i = positon % mImageViewList.size();
                    mIClickBanner.click(i);
                } else {
                    if (BuildConfig.DEBUG) {
                        Log.e(TAG, "          ");
                    }
                }
            }
        });
    }
    
  • BannerYのAdapter
  • public class BannerAdapter<T> extends PagerAdapter {
        private final static String TAG = BannerAdapter.class.getName();
        ArrayList<ImageView> mImageViewList;
        /**
         * @param mImageViewList ImageView     ,      IamgeView               .
         */
        public BannerAdapter(ArrayList<ImageView> mImageViewList) {
            this.mImageViewList = mImageViewList;
        }
        @Override
        public int getCount() {
            //   ViewPager     ,Integer.MAX_VALUE         ,             .
            return Integer.MAX_VALUE;
        }
        @SuppressLint("ClickableViewAccessibility")
        @NonNull
        @Override
        public Object instantiateItem(@NonNull ViewGroup container, final int position) {
            // position      ,          mImageViewList        .
            final int realPosition = position % mImageViewList.size();
            ImageView imageView = mImageViewList.get(realPosition);
            //      ImageView  ,               .
            imageView.setTag(position);
            ViewParent viewParent = imageView.getParent();
            if (viewParent != null) {
                //      ViewPager      .
                ((ViewGroup) viewParent).removeView(imageView);
            }
            //       ViewPager 
            container.addView(imageView);
            return imageView;
        }
    
        @Override
        public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
            return view == object;
        }
    
        @Override
        public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
            
        }
    }