안 드 로 이 드 사용자 정의 그림 라운드 방송 배 너 컨트롤 사용 분석

그림 순환 방송 컨트롤 은 모든 앱 이 기본적으로 사용 된다 고 할 수 있다.이 는 여러 개의 그림 을 동태 적 으로 보 여 주 는 데 사용 할 수 있다.이전에 두 개의 블 로 그 를 쓴 적 이 있다.ViewPager 의 무한 순환 을 실현 하 는 방식 1ViewPager 의 무한 순환 을 실현 하 는 방식 2이 두 개의 블 로그 에서 ViewPager 의 무한 순환 을 실현 하 는 원 리 를 분 석 했 으 나 사용 하 는 과정 에서 코드 의 해석 성 이 낮 기 때문에 사용자 정의 View 방식 으로 무한 순환 의 그림 순환 을 실현 하 는 패 키 징 을 사용 했다.
먼저 효과 보기:

기능 특징
  • 사용자 정의 너비 비율 지원
  • 사용자 정의 그림 전환 시간 지원
  • 사용자 정의 지시 점 색상 지원
  • 사용자 정의 지시 점 의 배경 색 지원
  • 사용자 정의 지시 점 높이 지원
  • 지시 점 표시 여 부 를 지원 합 니 다
  • 그림 마다 다른 클릭 이 벤트 를 설정 하 는 것 을 지원 합 니 다.
  • 사용 이 간단 하 다
    
     <com.xiaomai.bannerview.BannerView
        android:id="@+id/bannerView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:aspectRatio="1.5"
        app:defaultSrc="@mipmap/ic_launcher"
        app:indicatorBackground="@color/white"
        app:indicatorHeight="50dp"
        app:indicatorPositionSize="8dp"
        app:updateTime="3000" />
    
    
    실현 절차
  • 사용자 정의 속성 설명
  • 계승 RelativeLayout 클래스 만 들 기
  • 속성 분석
  • 사용자 정의 속성 설명
    values/attrs 파일 에 사용자 정의 속성 만 들 기
    
    <resources>
    
      <declare-styleable name="BannerView">
        <attr name="aspectRatio" format="float" />  <!--     -->
        <attr name="defaultSrc" format="integer|reference" />   <!--     -->
        <attr name="updateTime" format="integer" />   <!--        -->
        <attr name="indicatorVisible" format="boolean" /> <!--         -->
        <attr name="indicatorHeight" format="dimension" /> <!--        -->
        <attr name="indicatorBackground" format="color|reference" />  <!--          -->
        <attr name="indicatorPositionSize" format="dimension" /> <!--        -->
      </declare-styleable>
    
    </resources>
    
    
    BannerView 클래스 만 들 기
    
    public class BannerView extends RelativeLayout {
    
      public BannerView(Context context) {
        this(context, null);
      }
    
      public BannerView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
      }
    
      public BannerView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);}
    
    
    BannerView 에서 변수 속성 설명
    
    private Context context;
    
      private Handler handler;
      private ImageLoader imageLoader;
      private DisplayImageOptions options;
      private boolean isHaveHandler = true;//          ,  handler  ,       
      //   Start
      private ViewPager viewPager;
      private LinearLayout indicator;//    
      private onItemClickListener listener;
      //   End
    
      //      Start
      private float mAspectRatio; //    
      private int defaultImageResource; //      
      private int updateTime; //          ,  3 
      private boolean showIndicator; //        ,    
      private int indicatorHeight;//       ,  35dp
      private int indicatorPositionSize; //       
      private int indicatorBackground; //         
      //      End
      //   Start
      private int imageCount;
      private int lastPosition;
    
      private List<Integer> imageResources;
      private List<Image> imageUrls;
      //   End
    
    
    사용자 정의 속성 값 분석
    다음은 사용자 정의 속성 할당 을 위해 3 개의 매개 변수의 구조 방법 에서 변 수 를 초기 화 합 니 다.
    
    public BannerView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        parseCustomAttributes(context, attrs);
        this.context = context;
        handler = new Handler();
        imageLoader = ImageLoader.getInstance();
        options = HSApplication.getDisplayOptions().build();
        initViews();
      }
      /**
       *        
       *
       * @param context
       * @param attrs
       */
      private void parseCustomAttributes(Context context, AttributeSet attrs) {
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.BannerView);
        mAspectRatio = typedArray.getFloat(R.styleable.BannerView_aspectRatio, 0f);
        defaultImageResource = typedArray.getResourceId(R.styleable.BannerView_defaultSrc,
            R.drawable.about_us);
        updateTime = typedArray.getInt(R.styleable.BannerView_updateTime, 3000);
        showIndicator = typedArray.getBoolean(R.styleable.BannerView_indicatorVisible, true);
        indicatorHeight = (int) (typedArray.getDimension(R.styleable.BannerView_indicatorHeight,
            Utils.dip2px(context, 35)));
        indicatorBackground = typedArray.getResourceId(R.styleable.BannerView_indicatorBackground,
            R.color.white_alpha00);
        indicatorPositionSize = (int) typedArray.getDimension(
            R.styleable.BannerView_indicatorPositionSize, Utils.dip2px(context, 5));
        typedArray.recycle();
      }
      private void initViews() {
        viewPager = new ViewPager(context);
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
          @Override
          public void onPageScrolled(int position, float positionOffset,
              int positionOffsetPixels) {
    
          }
    
          @Override
          public void onPageSelected(int position) {
            if (showIndicator) {
              for (int i = 0; i < indicator.getChildCount(); i++) {
                indicator.getChildAt(i).setSelected(false);
              }
              indicator.getChildAt(position % imageCount).setSelected(true);
            }
            lastPosition = position;
          }
    
          @Override
          public void onPageScrollStateChanged(int state) {
            switch (state) {
              case ViewPager.SCROLL_STATE_IDLE://     
                if (!isHaveHandler) {
                  isHaveHandler = true;
                  handler.postDelayed(updateRunnable, updateTime);
                }
                break;
              case ViewPager.SCROLL_STATE_DRAGGING://       
                handler.removeCallbacks(updateRunnable);
                isHaveHandler = false;
                break;
            }
          }
        });
        addView(viewPager, new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.WRAP_CONTENT));
    
        if (showIndicator) {
          indicator = new LinearLayout(context);
          indicator.setOrientation(LinearLayout.HORIZONTAL);
          indicator.setGravity(Gravity.CENTER);
          indicator.setBackgroundResource(indicatorBackground);
          RelativeLayout.LayoutParams layoutParams = new LayoutParams(
              ViewGroup.LayoutParams.MATCH_PARENT, indicatorHeight);
          layoutParams.addRule(ALIGN_PARENT_BOTTOM);
          addView(indicator, layoutParams);
        }
    }
    컨트롤 과 사용자 정의 속성 은 모두 할당 과 초기 화 를 거 쳤 습 니 다.다음은 그림 자원 을 설정 해 야 합 니 다.
    
     public void setImageResources(List<Integer> imageResources) {
        if (imageResources == null || imageResources.size() == 0) {
          throw new RuntimeException("      ");
        }
        this.imageResources = imageResources;
        imageCount = imageResources.size();
      }
    
      public void setImageUrls(List<Image> imageUrls) {
        if (imageUrls == null || imageUrls.size() == 0) {
          throw new RuntimeException("        ");
        }
        this.imageUrls = imageUrls;
        imageCount = imageUrls.size();
        loadImages();
      }
    
      private void loadImages() {
        if (showIndicator) {
          addIndicationPoint();
        }
        viewPager.setAdapter(new MyViewPageAdapter());
        viewPager.setCurrentItem(200 - (200 % imageCount));
        handler.removeCallbacks(updateRunnable);
        handler.postDelayed(updateRunnable, updateTime);
      }
    
      /**
       *           
       */
      private void addIndicationPoint() {
        //         
        if (indicator.getChildCount() > 0) {
          indicator.removeAllViews();
        }
        View pointView;
        int margin = Utils.dip2px(context, 5f);
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
            indicatorPositionSize, indicatorPositionSize);
        layoutParams.setMargins(margin, margin, margin, margin);
    
        for (int i = 0; i < imageCount; i++) {
          pointView = new View(context);
          pointView.setBackgroundResource(R.drawable.indicator_selector);
          if (i == lastPosition) {
            pointView.setSelected(true);
          } else {
            pointView.setSelected(false);
          }
          indicator.addView(pointView, layoutParams);
        }
      }
    
      private class MyViewPageAdapter extends PagerAdapter {
        @Override
        public int getCount() {
          return Integer.MAX_VALUE;
        }
    
        @Override
        public boolean isViewFromObject(View view, Object object) {
          return view == object;
        }
    
        @Override
        public Object instantiateItem(ViewGroup container, final int position) {
          final ImageView imageView = new ImageView(container.getContext());
          imageView.setImageResource(defaultImageResource);
          imageView.setScaleType(ImageView.ScaleType.FIT_XY);
          final Image image = imageUrls.get(position % imageCount);
          imageLoader.displayImage(image.getImageUrl(), imageView, options);
          imageView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
              if (listener != null) {
                listener.onClick(v, position % imageCount, image.getAction(),
                    image.getUrl());
              }
            }
          });
          container.addView(imageView);
          return imageView;
        }
    
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
          container.removeView((View) object);
        }
      }
    
      private Runnable updateRunnable = new Runnable() {
        @Override
        public void run() {
          viewPager.setCurrentItem(lastPosition + 1);
          handler.postDelayed(updateRunnable, updateTime);
        }
    
    /**
       *         
       */
      public interface onItemClickListener {
        void onClick(View view, int position, String action, String url);
      }
    
      public void setOnItemClickListener(onItemClickListener listener) {
        this.listener = listener;
      }
    
    
    시간 이 너무 촉박 해서 상세 하 게 설명 하지 못 했 습 니 다.제GitHub를 옮 겨 서 전체 코드 를 볼 수 있 습 니 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기