ホームページ  >  記事  >  ウェブフロントエンド  >  Android カスタム AutoScrollViewPager: スライドを自動的に循環させる page_html/css_WEB-ITnose

Android カスタム AutoScrollViewPager: スライドを自動的に循環させる page_html/css_WEB-ITnose

WBOY
WBOYオリジナル
2016-06-24 11:47:101187ブラウズ

----------布局页面------------------------------------- ----------

android:id="@+id/luck_detail_adv_ContainerRl"
android:layout_width="match_parent"
android:layout _高さ="親の一致" >
android:id="@+id/luck_detail_Vp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffa1a1a1" />

android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:gravity="center"
android:orientation="horizo​​ntal"
android:paddingBottom="4.5dp"
android:paddingTop="4.5dp" >




----------------------------有為修正されたAutoScrollViewPager----- ------------------------------

パブリック クラス AutoScrollViewPager extends ViewPager {
/**ページクリックイベントを定義する*/
public Interface OnPageItemClickListener {
void onPageItemClickListener(T pd);
}
/**スライド時間間隔*/
private int mScrollTime = 0;
/**以前の場所*/
private int oldIndex = 0;
/**現在のページの場所 */
private int curIndex = 0;
/**画像データ収集*/
private List; mPagerData = new ArrayList();
/**アダプタ*/
private PagerAdapter pagerAdapter;
/**写真の下のレイアウトは、小さなドットの位置を示しています。*/
private LinearLayout indicatorView;
/**小ドットステータス画像resId*/
private int focusDrawable、normalDrawable;
private LayoutInflater インフレータ;
private OnPageItemClickListener pageItemClickListener;
/**それは偽りのサイクルでしょうか?*/
private boolean isFakeCycle = false;
/**スクロールを開始するかどうか*/
private boolean isStartScroll;
/**ページ変更の監視*/
private PageChangedCallBack mCallBack;
パブリック インターフェイス PageChangedCallBack {
void onPageChange(int Position);
}


public AutoScrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
inflater = LayoutInflater.from(context);
focusedDrawable = R.drawable.common_dot_selected ;
normalDrawable = R.drawable.common_dot_normal;


setInternalPageChangeListener(new OnPageChangeListener() {
public void onPageSelected(int i) {
if(mCallBack!=null)
mCallBack.onPageChange(i);
if (mPagerData. isEmpty() || インジケータービュー == null || インジケータービュー.getChildCount() == 0)
return;
curIndex = i % mPagerData.size();
/**ドットのチェックを外します*/
インジケータービュー.getChildAt(oldIndex) .setBackgroundResource(normalDrawable);
/**ドットが選択されました*/
indicatorView.getChildAt(curIndex).setBackgroundResource(focusedDrawable);
oldIndex = curIndex;
}


public void onPageScrolled(int arg0, float arg1, int arg2 ) {
}


public void onPageScrollStateChanged(int arg0) {
}
});


/**スライドアニメーション時間を設定します。デフォルトのアニメーション時間を使用する場合は、それを使用する必要はありません。*/
newFixedSpeedScroller(getContext()).setDuration(this, 700);


pagerAdapter = new MyPagerAdapter();
setAdapter(pagerAdapter);
/**プリロードされるデータの量を自分で設定してください*/
setOffscreenPageLimit(2);
/**requestDisallowInterceptTouchEvent() メソッドを使用して、ビューページャーとサブビュー間の競合を防止します。*/
requestDisallowInterceptTouchEvent(true);

options = new DisplayImageOptions .Builder().showImageOnLoading(R.drawable.index_advert_default) /**ロード中にデフォルトで画像が表示されます*/
.showImageForEmptyUri(R.drawable.index_advert_default) /**画像の URL が空の場合、デフォルトで画像が表示されます。*/
.showImageOnFail(R.drawable.index_advert_default) / **読み込みエラー時にデフォルトで画像を表示する*/
.resetViewBeforeLoading(false).build();
}

public void setPageChangeCallback(PageChangedCallBack clallBack){
mCallBack=clallBack;
}

@Override
protected void onAttachedToWindow() {
super .onAttachedToWindow();
if(isStartScroll){
start(mScrollTime);
}
}

@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if(isStartScroll)
handler.removeCallbacksAndMessage s(null );
}


/**内部インデックスの親ビューを構築する*/
private void initInnerIndicator() {
指標View = new IndicatorView(getContext());
指標View.setGravity(Gravity.CENTER);
指標View.setBackgroundColor(0x0fFF00FF) ;
indicatorView.setOrientation(LinearLayout.HORIZONTAL);
LayoutParams params = new LayoutParams();
params.width = ViewGroup.LayoutParams.MATCH_PARENT;
params.height = 40;
params.gravity = Gravity.BOTTOM;
addView( indicatorView, params);
}


public void setDatas(List imgUrls, LinearLayout outIndicator, boolean needInnerIndicator, boolean isFakeCycle) {
this.isFakeCycle = isFakeCycle;
setDatas(imgUrls, outIndicator, needInnerIndicator);
}

/**通話を繰り返すと通話不能になる場合があります*/
public void setDatas(List if (outIndicator != null) {
インジケータビュー = outIndicator;
}
else if (needInnerIndicator) {
initInnerIndicator();
}
mPagerData.clear();
mPagerData.addAll (imgUrls);
pagerAdapter.notifyDataSetChanged();
}

/**画像データをリロードし、VP コンテンツを更新します*/
public void freshDatas(List imgUrls, LinearLayout outIndicator, boolean needInnerIndicator,boolean isFakeCycle) {
this.isFakeCycle = isFakeCycle;
if (outIndicator != null) {
インジケータビュー = outIndicator;
}
else if (needInnerIndicator) {
initInnerIndicator();
}
mPagerData.clear();
mPagerData.addAll(imgUrls);
pagerAdapter = new MyPagerAdapter();
setAdapter(pagerAdapter);
pagerAdapter.notifyDataSetChanged();
}


@オーバーライド
void dataSetChanged() {
super.dataSetChanged();
setUpIndicator();
}


/**ドットを設定する*/
private void setUpIndicator() {
if (indicatorView != null) {
indicatorView. RemoveAllViews();
if (mPagerData.isEmpty()) {
インジケータビュー.setVisibility(View.GONE);
return;
}
else {
インジケータビュー.setVisibility(View.VISIBLE);
}
for (int i = 0; i < mPagerData.size(); i++) {
View v = inflate(R.layout.auto_scrollpage_dot、indicatorView、false);
v.setBackgroundResource(normalDrawable);
inventoryView.addView(v); }
indicatorView.getChildAt(0).setBackgroundResource(focusedDrawable);
}
curIndex = oldIndex = 0;
if (mPagerData.size() > 1 && isFakeCycle) {
setCurrentItem(15 - 15 % mPagerData.size());
}
else {
setCurrentItem(0);
}
}


/**実際の現在位置を取得する*/
public int getCurrentPosition( ) {
return curIndex;
}


/**実際の現在地データを取得する*/
public T getCurrentData() throws IndexOutOfBoundsException {
return mPagerData.get(curIndex);
}


@Override
public boolean onInterceptTouchEvent(Moイベントev) {
if (ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_CANCEL) {
start();
}
else {
handler.removeCallbacksAndMessages(null);
}
return super.onInterceptTouchEvent(ev);
}


@Override
public boolean onTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_CANCEL ) {
start();
}
else {
handler.removeCallbacksAndMessages(null);
}
return super.onTouchEvent(ev);
}


/**広告スクロールを開始します*/
private void start() {
start(mScrollTime);
}


public void start(intscrollTime) {
mScrollTime =scrollTime;
isStartScroll = false;
if (mScrollTime > 0 && !mPagerData.isEmpty()) {
isStartScroll = true ;
handler.sendMessageDelayed(handler.obtainMessage(), mScrollTime);
}
}


private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
handler.removeCallbacksAndMessages(null) );
if(isFakeCycle){
setCurrentItem(getCurrentItem() + 1);
}else{
if(getCurrentItem() == mPagerData.size()-1){
setCurrentItem(0, true);
}else {
setCurrentItem(getCurrentItem() + 1);
}
}
handler.sendMessageDelayed(handler.obtainMessage(), mScrollTime);
};
};
/**ネットワーク イメージをロードするには、Universal-Image-Loader オープン ソース フレームワークが使用されます*/
private DisplayImageOptions オプション;

public void setImageOptions(DisplayImageOptions options){
this.options=options;
}


/**ViewPager アダプター*/
private class MyPagerAdapter extends PagerAdapter {


@Override
public int getCount() {
if (mPagerData.size() == 1) {
return 1;
}
else if (mPagerData.size() > 1) {
isFakeCycle を返す ? Integer.MAX_VALUE : mPagerData.size(); 
}
return 0;
}

@Override
public Object instantiateItem(ViewGroup コンテナ, int Position) {
Final int realP = Position % mPagerData.size();
Final ImageView netImgView = (ImageView) inflater.inflate(R .layout.auto_scrollpage_img, コンテナ, false);
ImageLoader.getInstance().displayImage(mPagerData.get(realP).getImageUrl(), netImgView, options);
netImgView.setOnClickListener(new View.OnClickListener() {


@Override
public void onClick(View v) {
if (pageItemClickListener != null) {
pageItemClickListener.onPageItemClickListener(mPagerData.get(realP));
}
}
});


container.addView(netImgView) ;
return netImgView;
}


@Override
public void destroyItem(ViewGroup コンテナ, int 位置, Object オブジェクト) {
if (オブジェクト インスタンスオブビュー) {
コンテナ.removeView((View) オブジェクト);
}
}


@Override
public boolean isViewFromObject(ビュー ビュー, オブジェクト オブジェクト) {
return view == object;
}
}


/**表示項目のクリックイベントを設定する*/
public void setOnPageItemClickListener(OnPageItemClickListener pageItemClickListener) {
this.pageItemClickListener = pageItemClickListener;
}
}

--- ---------------内部データ モデル、必要に応じて追加---------------------------- ---- ------------


パブリック インターフェース PagerImageData{
public String getImageUrl();/**ネットワーク画像を表示するために使用されます*/
public void setImageUrl(String imgUrl);
}

-- ------------------アクティビティでの AutoScrollViewPager の使用---------------------- -- --------------------------------

/**画像表示、ImageBean はプロジェクトでサーバー JSON データを要求する (PagerImageData を継承する) ために使用されるエンティティ Bean です*/
プライベート AutoScrollViewPager広告Vp;

広告Vp = (AutoScrollViewPager) findViewById(R.id.luck_detail_Vp);

advertiseVp.setOnPageItemClickListener(new OnPageItemClickListener() {
@Override
public void onPage ItemClickListener(ImageBean pd) {
// ページ クリック イベント、目的の効果を実行します (全体像を表示する、他の場所にジャンプするなど)
}
});

/**データの追加 imageArray はサーバーから取得した画像 URL のコレクションです。List imageArray=new ArrayList() を用意し、そこに必要なデータを追加することもできます。*/

AdvertiseVp.refreshDatas(imageArray, ( LinearLayout) findViewById(R. id.luck_detail_adv_dotLl), false, true);
AdvertiseVp.start(3000);

Activity のコードが書ききれていないので時間があれば、 で使用したものを整理します。記事内の 2 つの赤い箇所に注目してください。コードでは省略されています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。