English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
먼저 이미지를 보여드리겠습니다:
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(보고서 작성 시,#을 @으로 변경하십시오. 신고하시고 관련 증거를 제공하시면, 사실이 확인되면 이 사이트는 즉시 저작권 침해 내용을 삭제합니다.