English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Android ViewPager로 슬라이드 쇼 효과 구현

먼저 이미지를 보여드리겠습니다:

ViewPager가 루프 효과를 구현하는 것에 대해 이야기하면, PagerAdapter를 사용하는 것은 필수입니다. 그런 다음 이 클래스에 대해 먼저 소개하겠습니다.

PagerAdapter 소개

PagerAdapter는 Android.support.v4패키지 안의 클래스는 abstract 클래스로, Object를 직접 상속하여 import 패키지 android.support.v4.view.PagerAdapter를 사용할 수 있습니다.

PagerAdapter는 viewPager의 어댑터이며, viewPager는 android.support.v4확장 패키지에 추가된 강력한 컨트롤러로, 컨트롤러의 슬라이딩 효과를 구현할 수 있습니다. 예를 들어, 우리가 소프트웨어에서 흔히 볼 수 있는 광고 패널의 슬라이딩 효과를 viewPager를 사용하여 구현할 수 있습니다. 오늘은 viewPager를 사용하는 방법과 PagerAdapter를 재정의하여 일반 광고 패널의 슬라이딩 효과를 구현하는 방법을 소개합니다.

추상 클래스이므로, 이를 상속받은 새로운 클래스를 생성하여 네 가지 메서드를 재정의합니다:

 1.public Object instantiateItem(ViewGroup container, int position)

 2.public void destroyItem(ViewGroup container, int position, Object object)

 3.public int getCount()

 4.public boolean isViewFromObject(View arg0, Object arg1)

MyViewPagerAdapter 클래스:

public class MyViewPagerAdapter extends PagerAdapter {
private List<ImageView> mList;
public MyViewPagerAdapter(List<ImageView> mList){
 this.mList=mList;
}
//표시할 이미지가缓存될 때, 이 메서드를 호출하여 이미지를 초기화합니다
//표시할 ImageView를 ViewGroup에 추가합니다
public Object instantiateItem(ViewGroup container, int position) {
 // TODO 자동-생성된 메서드 스탑
 container.addView(mList.get(position));
 return mList.get(position);
}
@Override
//PagerAdapter는 표시할 이미지 세 장만缓存하며, 슬라이딩 이미지가缓存 범위를 벗어났을 때 이 메서드를 호출하여 이미지를 파괴합니다
public void destroyItem(ViewGroup container, int position, Object object) {
 // TODO 자동-생성된 메서드 스탑
 container.removeView(mList.get(position));
}
//获取要滑动的控件的数量,
public int getCount() {
 // TODO 자동-생성된 메서드 스탑
 return mList.size();
}
//来判断显示的是否是同一张照片,这个我们将两个图片对比 再返回
public boolean isViewFromObject(View arg0, Object arg1) {
 // TODO 자동-생성된 메서드 스탑
 return arg0==arg1;
}
}

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v4.view.ViewPager
 android:id="@"+id/vp"
 android:layout_width="match_parent"
 android:layout_height="200dp" />
<LinearLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_alignBottom="@id/vp"
 android:background="#33000000"
 android:orientation="vertical"
 android:paddingBottom="10dp" >
 <LinearLayout
 android:id="@"+id/ll_points"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:gravity="center_horizontal"
 android:orientation="horizontal"
 android:paddingBottom="10dp" >
 </LinearLayout>
</LinearLayout>
</RelativeLayout>

MainActivity:

public class MainActivity extends Activity {
private ViewPager mVp;
//private TextView tvTitle;
private LinearLayout llPoints;
//private String[] titles;// 모든 표시할 제목을 저장합니다
private int[] images;// 모든 표시할 이미지 자원 ID를 저장합니다
private List<ImageView> list = new ArrayList<ImageView>();;// ViewPager 객체에 표시할 모든 ImageView 객체를 저장합니다
private int prevPosition = 0;
private Handler handler = new Handler() {
 @SuppressLint("HandlerLeak") 
 public void handleMessage(android.os.Message msg) {
 switch (msg.what) {
 case 0:
  // mvp 현재 페이지의 인덱스를 얻습니다
  int currentItem = mVp.getCurrentItem();
  // 표시할 다음 페이지의 인덱스
  currentItem++;
  // ViewPager가 표시하는 페이지를 설정합니다
  mVp.setCurrentItem(currentItem % list.size());
  break;
 default:
  break;
 }
 };
};
@SuppressWarnings("deprecation")
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 initView(); 
 // titles = getTitles();
 images = getImages();
 for (int i = 0; i < images.length; i++) {
 ImageView iv = new ImageView(this);
 iv.setBackgroundResource(images[i]);
 list.add(iv);
 //이미지의 수에 따라 해당 수의 작은 원점을 생성합니다
 final View view = new View(this);
 view.setBackgroundResource(R.drawable.login__05);
 DisplayMetrics metrics = new DisplayMetrics();
 float width=TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX,30, metrics);
 float height=TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 30, metrics);
 LinearLayout.LayoutParams params=new LinearLayout.LayoutParams((int)width,(int)height);
 params.leftMargin=5;
 view.setLayoutParams(params);
 llPoints.addView(view);
 }
 //첫 페이지에 표시할 제목 설정
 //tvTitle.setText(titles[0]);
 //첫 페이지를 설정할 때, 작은 원 표시의 배경 이미지 설정
 llPoints.getChildAt(0).setBackgroundResource(R.drawable.login__03);
 //ViewPagerAdapter를 포장합니다
 MyViewPagerAdapter adapter=new MyViewPagerAdapter(list);
 mVp.setAdapter(adapter);
 //ViewPager 객체의 페이지 변화 시监听 설정
 mVp.setOnPageChangeListener(new OnPageChangeListener() {
 @Override
 //다음 페이지가 선택되었을 때
 public void onPageSelected(int arg0) {
  // TODO 자동-생성된 메서드 스탑
  //tvTitle.setText(titles[arg0%list.size()]);
  llPoints.getChildAt(prevPosition).setBackgroundResource(R.drawable.login__05);
  llPoints.getChildAt(arg0).setBackgroundResource(R.drawable.login__03);
  //현재 포인트 위치를 다음 변화의 이전 포인트 위치로 사용합니다
  prevPosition=arg0;
 }
 @Override
 public void onPageScrolled(int arg0, float arg1, int arg2) {
  // TODO 자동-생성된 메서드 스탑
 }
 @Override
 public void onPageScrollStateChanged(int arg0) {
  // TODO 자동-생성된 메서드 스탑
 }
 });
 new Thread(new Runnable() {
 @Override
 public void run() {
  // TODO 자동-생성된 메서드 스탑
  while (true) {
  SystemClock.sleep(3000);
  handler.sendEmptyMessage(0);
  }
 }
 }).start();
}
private void initView() {
 // TODO 자동-생성된 메서드 스탑
 mVp = (ViewPager) findViewById(R.id.vp);
 //tvTitle = (TextView) findViewById(R.id.tv_title);
 llPoints = (LinearLayout) findViewById(R.id.ll_points);
}
private int[] getImages(){
 return new int[]{R.drawable.banner_01,R.drawable.banner_02,R.drawable.banner_03};
}
}

이것이 이 문서의 전체 내용입니다. 많은 도움이 되길 바랍니다. 또한,呐喊 튜토리얼을 많이 지지해 주시기 바랍니다.

성명서: 이 문서의 내용은 인터넷에서 가져왔으며, 저작권은 원저자에게 있으며, 내용은 인터넷 사용자가 자발적으로 기여하고 자체로 업로드한 것이며, 이 사이트는 소유권을 가지지 않으며, 인공 편집 처리를 하지 않았으며, 관련 법적 책임을 부담하지 않습니다. 저작권 침해가 의심되는 내용을 발견하면, notice#w로 이메일을 보내 주시기 바랍니다.3codebox.com(보고서 작성 시,#을 @으로 변경하십시오. 신고하시고 관련 증거를 제공하시면, 사실이 확인되면 이 사이트는 즉시 저작권 침해 내용을 삭제합니다.

추천 합니다