안 드 로 이 드 는 사용자 정의 라운드 이미지 컨트롤 에 대한 상세 한 설명 을 실현 합 니 다.

우선 효과 도 를 올 립 니 다.

실현 원리
라운드 사진 을 완성 하려 면 먼저 생각 나 는 것 은 ViewPager 으로 이 루어 져 야 한다.ViewPager 은 이미 미 끄 러 지 는 기능 을 가지 고 있 으 며,우 리 는 그것 을 스스로 구 르 기만 하면 된다.아래 의 작은 도 트 를 더 하면 된다.그래서 우리 의 이번 사용자 정의 컨트롤 은 ViewPagerLinearLayout 이 중첩 되 어 구성 되 었 다.
사용자 정의 ViewPager 만 들 기
먼저 완전한 코드 를 올 립 니 다.

package com.kcode.autoscrollviewpager.view;

import android.content.Context;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;

import java.util.Timer;
import java.util.TimerTask;

/**
 * Created by caik on 2016/10/10.
 */

public class AutoViewPager extends ViewPager {

 private static final String TAG = "AutoViewPager";

 private int currentItem;

 private Timer mTimer;
 private AutoTask mTask;

 private boolean isFirst = true;

 public AutoViewPager(Context context) {
  super(context);
 }

 public AutoViewPager(Context context, AttributeSet attrs) {
  super(context, attrs);
 }


 public void start(){
  if (mTimer == null) {
   mTimer = new Timer();
  }
  mTimer.schedule(new AutoTask(),3000,3000);

 }

 private Runnable runnable = new Runnable() {
  @Override
  public void run() {
   currentItem = getCurrentItem();
   if(currentItem == getAdapter().getCount() - 1){
    currentItem = 0 ;
   }else {
    currentItem++ ;
   }
   setCurrentItem(currentItem);
  }
 };

 private AutoHandler mHandler = new AutoHandler();

 public void updatePointView(int size) {
  if (getParent() instanceof AutoScrollViewPager){
   AutoScrollViewPager pager = (AutoScrollViewPager) getParent();
   pager.initPointView(size);
  }else {
   Log.e(TAG,"parent view not be AutoScrollViewPager");
  }
 }

 public void onPageSelected(int position) {
  AutoScrollViewPager pager = (AutoScrollViewPager) getParent();
  pager.updatePointView(position);
 }

 private class AutoTask extends TimerTask{

  @Override
  public void run() {
   mHandler.post(runnable);
  }
 }

 private final static class AutoHandler extends android.os.Handler{
  @Override
  public void handleMessage(Message msg) {
   super.handleMessage(msg);

  }
 }

 public void onStop(){
  //      
  if (mTimer != null) {
   mTimer.cancel();
   mTimer = null;
  }
 }

 public void onDestroy(){
  onStop();
 }

 public void onResume(){
  start();
 }

 @Override
 public boolean onTouchEvent(MotionEvent ev) {
  switch (ev.getAction()){
   case MotionEvent.ACTION_DOWN:
    Log.i(TAG,"down");
    onStop();
    break;
   case MotionEvent.ACTION_MOVE:
    Log.i(TAG,"move");
    break;
   case MotionEvent.ACTION_UP:
    Log.i(TAG,"up");
    onResume();
    break;
  }
  return super.onTouchEvent(ev);
 }
}
AutoViewPager 가 ViewPager 에 계승 되 었 습 니 다.타 이 머 를 통 해 타 이 머 를 시작 합 니 다.

public void start(){
  if (mTimer == null) {
   mTimer = new Timer();
  }
  mTimer.schedule(new AutoTask(),3000,3000);

 }

 private Runnable runnable = new Runnable() {
  @Override
  public void run() {
   currentItem = getCurrentItem();
   if(currentItem == getAdapter().getCount() - 1){
    currentItem = 0 ;
   }else {
    currentItem++ ;
   }
   setCurrentItem(currentItem);
  }
 };
3 초 마다 페이지 를 업데이트 합 니 다.이렇게 하면 스스로 구 르 는 효 과 를 낼 수 있다.
2.어댑터 설정
무한 순환 을 이 루 려 면 Adapter 의 getCount() 방법 을 무한대 로 되 돌려 주 고 Integer.MAX_VALUE 으로 돌아 가면 된다.
완전한 Adapter 코드:

package com.kcode.autoscrollviewpager.view;

import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.kcode.autoscrollviewpager.R;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by caik on 2016/10/11.
 */

public abstract class BaseViewPagerAdapter<T> extends PagerAdapter implements ViewPager.OnPageChangeListener{

 private List<T> data = new ArrayList<>();

 private Context mContext;
 private AutoViewPager mView;

 private OnAutoViewPagerItemClickListener listener;

 public BaseViewPagerAdapter(List<T> t) {
  this.data = t;
 }

 public BaseViewPagerAdapter(Context context, AutoViewPager viewPager) {
  this.mContext = context;
  mView = viewPager;
  mView.setAdapter(this);
  mView.addOnPageChangeListener(this);
  mView.setCurrentItem(0);
 }


 public BaseViewPagerAdapter(Context context, AutoViewPager viewPager,OnAutoViewPagerItemClickListener listener) {
  this.mContext = context;
  mView = viewPager;
  this.listener = listener;
  mView.setAdapter(this);
  mView.addOnPageChangeListener(this);
  mView.setCurrentItem(0);
 }

 public BaseViewPagerAdapter(Context context, List<T> data,AutoViewPager viewPager,OnAutoViewPagerItemClickListener listener) {
  this.mContext = context;
  mView = viewPager;
  this.data = data;
  this.listener = listener;
  mView.setAdapter(this);
  mView.addOnPageChangeListener(this);
  mView.setCurrentItem(0);

  mView.start();
  mView.updatePointView(getRealCount());
 }

 public void add(T t){
  data.add(t);
  notifyDataSetChanged();
  mView.updatePointView(getRealCount());
 }

 @Override
 public int getCount() {
  return data == null ? 0 : Integer.MAX_VALUE;
 }

 public int getRealCount(){
  return data == null ? 0 : data.size();
 }

 @Override
 public void destroyItem(ViewGroup container, int position, Object object) {
  container.removeView((ImageView) object);
 }

 @Override
 public Object instantiateItem(ViewGroup container, final int position) {
  ImageView view = (ImageView) LayoutInflater.from(mContext)
    .inflate(R.layout.imageview,container,false);
  view.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View view) {
    if (listener != null) {
     listener.onItemClick(position % getRealCount(),data.get(position % getRealCount()));
    }
   }
  });

  loadImage(view,position, data.get(position % getRealCount()));
  container.addView(view);

  return view;
 }

 public abstract void loadImage(ImageView view,int position,T t);

 @Override
 public boolean isViewFromObject(View view, Object object) {
  return view == object;
 }

 @Override
 public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

 }

 @Override
 public void onPageSelected(int position) {
  mView.onPageSelected(position % getRealCount());
 }

 @Override
 public void onPageScrollStateChanged(int state) {

 }

 public interface OnAutoViewPagerItemClickListener<T> {
  void onItemClick(int position,T t);
 }
}
여기 서 우 리 는 범 형 을 사용 했다.왜냐하면 때때로 우 리 는 하나의 url 만 집합 해서 들 어 올 수도 있 고 대상 이 집합 해서 확장 하기 편리 하기 때문이다.그림 을 불 러 오 는 방법 도 추상 적 인 방법 이다.

public abstract void loadImage(ImageView view,int position,T t);
앱 마다 사용 하 는 이미지 로 딩 프레임 워 크 가 다 르 기 때문에 여기 로 딩 은 앱 을 남 겨 두 고 스스로 이 루어 집 니 다.사용 할 때 Adapter 를 만 들 면 이곳 의 BaseViewPagerAdapter 을 계승 한 다음 loadImage(ImageView view,int position,T t) 방법 을 다시 쓰 고 여기 서 그림 을 불 러 오 면 됩 니 다.
만약 당신 이 아래쪽 의 작은 원점 표 시 를 원 하지 않 는 다 면,여 기 는 이미 완성 되 었 을 것 입 니 다.
사용 시 직접 사용

 <com.kcode.autoscrollviewpager.view.AutoViewPager
  android:layout_width="match_parent"
  android:layout_height="200dp">
  
 </com.kcode.autoscrollviewpager.view.AutoViewPager>
대신 하 다

 <android.support.v4.view.ViewPager
  android:layout_width="match_parent"
  android:layout_height="match_parent">

 </android.support.v4.view.ViewPager>
됐 습 니 다.밑 에 작은 도 트 표시 가 필요 하 시 면 계속 아래로 내 려 가세 요.
3.작은 원점 표시 추가
작은 원점 표 시 를 추가 해 야 한다 면.사실은 ViewPager 에 한 겹 더 붙 이 는 거 야.relative Layout 에 계승 할 View 를 새로 만 듭 니 다.
전체 코드 는 다음 과 같 습 니 다:

package com.kcode.autoscrollviewpager.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

import com.kcode.autoscrollviewpager.R;

import static android.view.Gravity.CENTER;

/**
 * Created by caik on 2016/10/17.
 */

public class AutoScrollViewPager extends RelativeLayout{

 private AutoViewPager mViewPager;

 private Context mContext;

 private LinearLayout layout;

 public AutoScrollViewPager(Context context) {
  super(context);
  init(context);
 }

 public AutoScrollViewPager(Context context, AttributeSet attrs) {
  super(context, attrs);
  init(context);
 }

 private void init(Context context){
  mContext = context;
  mViewPager = new AutoViewPager(context);
  layout = new LinearLayout(mContext);
  addView(mViewPager);
 }

 public AutoViewPager getViewPager() {
  return mViewPager;
 }

 public void initPointView(int size){

  layout = new LinearLayout(mContext);
  for (int i = 0; i < size; i++) {
   ImageView imageView = new ImageView(mContext);
   LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(20,20);
   params.leftMargin = 8;
   params.gravity = CENTER;
   imageView.setLayoutParams(params);
   if (i == 0) {
    imageView.setBackgroundResource(R.drawable.point_checked);
   }else {
    imageView.setBackgroundResource(R.drawable.point_normal);
   }

   layout.addView(imageView);
  }

  LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
  layoutParams.addRule(ALIGN_PARENT_BOTTOM);
  layoutParams.addRule(ALIGN_PARENT_RIGHT);
  layoutParams.setMargins(12,20,12,20);
  layout.setLayoutParams(layoutParams);
  addView(layout);
 }

 public void updatePointView(int position) {
  int size = layout.getChildCount();
  for (int i = 0; i < size; i++) {
   ImageView imageView = (ImageView) layout.getChildAt(i);
   if (i == position){
    imageView.setBackgroundResource(R.drawable.point_checked);
   }else {
    imageView.setBackgroundResource(R.drawable.point_normal);
   }

  }
 }

}
초기 화 할 때 ViewPager,LinearLayout 을 만 듭 니 다.

 public AutoScrollViewPager(Context context) {
  super(context);
  init(context);
 }

 public AutoScrollViewPager(Context context, AttributeSet attrs) {
  super(context, attrs);
  init(context);
 }

 private void init(Context context){
  mContext = context;
  mViewPager = new AutoViewPager(context);
  layout = new LinearLayout(mContext);
  addView(mViewPager);
 }
addView(mViewPager); 을 통 해 추가 합 니 다.
두 장의 그림 을 준비 해 야 합 니 다.여 기 는 Shape 로 그립 니 다.Shape 사용 은 Android Shape 사용 을 볼 수 있 습 니 다.
작은 원점 초기 화:

 public void initPointView(int size){

  layout = new LinearLayout(mContext);
  for (int i = 0; i < size; i++) {
   ImageView imageView = new ImageView(mContext);
   LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(20,20);
   params.leftMargin = 8;
   params.gravity = CENTER;
   imageView.setLayoutParams(params);
   if (i == 0) {
    imageView.setBackgroundResource(R.drawable.point_checked);
   }else {
    imageView.setBackgroundResource(R.drawable.point_normal);
   }

   layout.addView(imageView);
  }

  LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
  layoutParams.addRule(ALIGN_PARENT_BOTTOM);
  layoutParams.addRule(ALIGN_PARENT_RIGHT);
  layoutParams.setMargins(12,20,12,20);
  layout.setLayoutParams(layoutParams);
  addView(layout);
 }
작은 원점 업데이트:

 public void updatePointView(int position) {
  int size = layout.getChildCount();
  for (int i = 0; i < size; i++) {
   ImageView imageView = (ImageView) layout.getChildAt(i);
   if (i == position){
    imageView.setBackgroundResource(R.drawable.point_checked);
   }else {
    imageView.setBackgroundResource(R.drawable.point_normal);
   }

  }
 }
작은 원점 이 있 는 다음 컨트롤 을 사용 하 십시오.

 <com.kcode.autoscrollviewpager.view.AutoScrollViewPager
  android:id="@+id/viewPager"
  android:layout_width="match_parent"
  android:layout_height="220dp">

 </com.kcode.autoscrollviewpager.view.AutoScrollViewPager>
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.

좋은 웹페이지 즐겨찾기