ホームページの写真のカルーセル
/** * 広告画像自動回転制御<br> * */public class ImageCycleView extends LinearLayout { /** * Context*/ private Context mContext /** * 画像回転ビュー*/ private ViewPager mAdvPager = null; * * スクロール画像表示調整*/ private ImageCycleAdapter mAdvAdapter; /** * 画像回転インジケーター制御*/ private ViewGroup mGroup; /** *画像カルーセルは各画像を示します */ private ImageView mImageView = null; /** * 画像のスクロール命令ビュー リスト */ private ImageView[] mImageViews = null; /** * 現在の画像をスクロールする添字 */ private boolean isStop; * カーソルが丸いか長いか。0 に設定すると長いになります。デフォルトは丸いです。 */ public int stype=1;パラメータコンテキスト */パブリックImageCycleView(Context context) { super(context); } /** * @param context * @param attrs */ @SuppressLint("Recycle") public ImageCycleView(Context context, AttributeSet attrs) { super(context, attrs); = コンテキスト; LayoutInflater.from(context).inflate(R.layout.ad_cycle_view, this); (ViewPager) findViewById(R.id.adv_pager); mAdvPager.setOnPageChangeListener(new GuidePageChangeListener()) // 画像の右下のインジケーターをスクロールします mGroup = (ViewGroup) findViewById(R.id.viewGroup); * タッチするとタイマーが停止し、リフトするとタイマーが開始します*/ @Override public boolean dispatchTouchEvent(MotionEvent event) { if(event.getAction()==MotionEvent.ACTION_UP){ // 画像のスクロールを開始 startImageTimerTask(); }else{ // 画像のスクロールを停止 stopImageTimerTask() } return super.dispatchTouchEvent(event); } /** * 画像データの読み込み * * @param imageUrlList * @param imageCycleViewListener */ public void setImageResources(ArrayList<Integer> imageUrlList,ImageCycleViewListener imageCycleViewListener,int stype){ this.stype=stype; // Clear mGroup.removeAllViews() // イメージ広告の数 Final int imageCount = imageUrlList.size(); mImageViews = new ImageView[imageCount]; for (int i = 0; i < imageCount; i++) { mImageView = new ImageView(mContext) = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); mImageView.setLayoutParams(params); mImageViews[i] = mImageView; if (i == 0) { if(this.stype==1)// mImageViews[i].setBackgroundResource(R.drawable.banner_dian_focus) mImageViews[i].setBackgroundResource(R.drawable) .cicle_banner_dian_focus);//else に変更mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_focus); } else { if(this.stype==1) // mImageViews[i].setBackgroundResource(R.drawable.banner_dian_blur); .drawable.cicle_banner_dian_blur); mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_blur); } mGroup.addView(mImageViews[i]) } mAdvAdapter = new ImageCycleAdapter(mContext, imageUrlList,imageCycleViewListener); mAdvPager.setCurrentItem(Integer.MAX_VALUE/2); startImageTimerTask(); } public void setImageResources2(ArrayList<Integer> imageUrlList ,ImageCycleViewListener imageCycleViewListener,int stype){ // mGroup.removeAllViews();イメージ広告の最終 int 数imageCount = imageUrlList.size(); mImageViews = new ImageView[imageCount]; for (int i = 0; i < imageCount; i++) { mImageView = new ImageView(mContext); WRAP_CONTENT); params.leftMargin=30; mImageView.setScaleType(ScaleType.CENTER_CROP); mImageView.setLayoutParams(params); mImageViews[i] = mImageView; if (this.stype==1)// mImageViews[i].setBackgroundResource(R) .drawable.banner_dian_focus); mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_focus);//else を変更します mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_focus) } else { if(this.stype==1) // mImageViews[i ]; .setBackgroundResource(R.drawable.banner_dian_blur); mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_blur); else mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_blur) } mGroup.addView(mImageViews[i]); mAdvAdapter = new ImageCycleAdapter(mContext, imageUrlList) ,imageCycleViewListener); mAdvPager.setAdapter(mAdvAdapter); mAdvPager.setCurrentItem(Integer.MAX_VALUE/2); } /** * 画像カルーセル (リソース制御に便利) void startImageCycle() { startImageTimerTask() } /** *カルーセルの一時停止 - リソースの保存に使用します*/ public void PushImageCycle() { stopImageTimerTask(); } /** * 画像スクロール タスク*/ private void startImageTimerTask() { // 画像スクロール mHandler.postDelayed(mImageTimerTask, 5000) ); } /** * 画像スクロールタスクを停止します*/ private void stopImageTimerTask() { isStop=true; mHandler.removeCallbacks(mImageTimerTask); } private Handler mHandler = new Handler(); /** * 自動画像回転タスク */ private Runnable mImageTimerTask = new Runnable() ) { if (mImageViews != null) { mAdvPager.setCurrentItem(mAdvPager.getCurrentItem()+1); if(!isStop){ //if isStop=true //終了するときは、これを停止する必要があります。そうしないと、存在し続けてバックグラウンドの mHandler でループします。 postDelayed( mImageTimerTask, 5000); } } } }; /** * カルーセル画像の監視* * @author minking */ private Final class GuidePageChangeListener は OnPageChangeListener を実装します { @Override public void onPageScrollStateChanged(int state) { if (state == ViewPager.SCROLL_STATE_IDLE) startImageTimerTask(); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int インデックス) {index=index%mImageViews.length; // 現在表示されている画像を設定します // 画像スクロール インジケーターを元に戻します if(stype!=1) mImageViews[index].setBackgroundResource(R.drawable.cicle_banner_dian_focus); else mImageViews[index] .setBackgroundResource(R.drawable.cicle_banner_dian_focus); for (int i = 0; i < mImageViews.length; i++) { if (index != i) { if(stype!=1) mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_blur) else mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_blur)プライベート クラス ImageCycleAdapter を拡張しますPagerAdapter { /** * 画像ビュー キャッシュ リスト*/ private ArrayList<SmartImageView> mImageViewCacheList /** * 画像リソース リスト*/ //private ArrayList<String> mAdList = new ArrayList<String>(); mAdList = new ArrayList<Integer>(); /** * 広告画像のクリック監視*/ private ImageCycleViewListener mImageCycleViewListener; private Context mContext;// public ImageCycleAdapter(Context context, ArrayList<String> adList, ImageCycleViewListener) {// this.mContext = context; // mImageCycleViewListener = imageCycleViewListener;新しいArrayList<SmartImageView>();// } public ImageCycleAdapter(Context context, ArrayList<Integer> adList , ImageCycleViewListener imageCycleViewListener) { this.mContext = context; mImageCycleViewListener = imageCycleViewListener; mImageViewCacheList; ); } public int getCount() { return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object obj) { return view == obj; } @Override public Object instantiateItem(ViewGroup コンテナ, 最終 int 位置) { int imageUrl = mAdList .get(position%mAdList.size()); Log.e("imageUrl:",position%mAdList.size()+"--"+imageUrl+""); SmartImageView imageView = null if (mImageViewCacheList.isEmpty()) { imageView = new SmartImageView(mContext); .setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); //imageView.setScaleType(ImageView.ScaleType.CENTER_CROP) } else { imageView.setTag(imageView); .setImageUrl(imageUrl); //画像クリックリスナーを設定します imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mImageCycleViewListener.onImageClick(position%mAdList.size(), v); } }); public void destroyItem(ViewGroup コンテナ, int 位置, Object オブジェクト) { SmartImageView view = (SmartImageView) object; mAdvPager.removeView(view); mImageViewCacheList.add(view); } } /** * カルーセル コントロールのイベントをリッスンします* * @author minking */ public static Interface ImageCycleViewListener { /** * 画像をクリックしますイベント * * @paramposition * @param imageView */ public void onImageClick(intposition, View imageView) } }
Android ViewPager に基づく画像カルーセル コントロールを見てみましょう
パッケージ me.lanfog.myandroid.widget; インポート java.util.ArrayList; インポート java.util.List; インポート android.content.Context; インポート android.os.Message; インポート android.support.v4 .view.PagerAdapter;インポート android.support.v4.view.ViewPager;インポート android.util.AttributeSet;インポートandroid.util.Log;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView; public class PageFlipper extends ViewPager { private String TAG = PageFlipper.class.getSimpleName();ビュー; private PagerAdapter アダプター = new PagerAdapter() { @Override public Object instantiateItem(ViewGroup コンテナー, int Position) { View v = ビュー.get(位置); コンテナ.addView(v); } @Override public boolean isViewFromObject(View arg0, Object arg1) } @Override public int getItemPosition(Object オブジェクト) views.indexOf(object); } @Override public void destroyItem(ViewGroup コンテナ, int 位置, Object オブジェクト) { container.removeView((View)object); } @Override public int getCount() { return views == null ? 0 : views.size() } };コントロールの位置をデータセット内の位置に変換します*/ public intconvert(intposition){ return Position == 0 ? views.size()-1 : (position > views.size() ? 0 : 位置-1 ); } @Override public void onPageSelected(intposition) { if(listener2 != null){listener2.onPageSelected(convert(position)) } } @Override public void onPageScrolled(intposition, float パーセント, int offset) { if(listener2 != null){listener2.onPageScrolled(convert(position), パーセント, offset) }; if(percent == 0){ if(position == 0) // 最後から 2 番目のページに切り替えます setCurrentItem(( views.size() - 2 ) % views.size(), false); .size() - 1) // 2 番目のポジティブ ページに切り替えます setCurrentItem(1, false) } } @Override public void onPageScrollStateChanged(int state) { if(listener2) != null){listener2.onPageScrollStateChanged(state); } switch (state) { case SCROLL_STATE_IDLE: // アイドル if(!handler.hasMessages(START_FLIPPING)) handler.sendEmptyMessageDelayed(START_FLIPPING, 3000); // 遅延スクロール ブレーク; SCROLL_STATE_DRAGGING: // Handler.sendEmptyMessage(STOP_FLIPPING); // スクロールをキャンセルします Break; case SCROLL_STATE_SETTLING: // ドラッグ終了します stop_FLIPPING = 0; private Handler handler = new Handler() { public void handleMessage(Message msg) { スイッチ(msg.what) { case START_FLIPPING: if(views.size() > 3) // 前後のページは補助ページであるため、ここでの 3 は 1 ページのみを意味します setCurrentItem((getCurrentItem() + 1) % views.size ()); handler.sendEmptyMessageDelayed(START_FLIPPING, 3000); // 遅延スクロール ブレーク; handler.removeMessages(START_FLIPPING); } } ; public PageFlipper(Context context, AttributeSet attrs) }; public PageFlipper(Context context) { init(); ; } プライベート void init(){ setOffscreenPageLimit(1);最大ページ キャッシュ数 setAdapter(adapter); // アダプター super.setOnPageChangeListener(listener); // リスナー handler.sendEmptyMessageDelayed(START_FLIPPING, 3000) // 遅延スクロール} public void setViews(int[] ids); new ArrayList<View>(); for(int i=0;i<ids.length+2;i++){ // 先頭に最後のページを追加し、末尾にホームページを追加します。 ImageView iv = new ImageView(getContext()); iv.setImageResource(ids[i == 0 ? ids.length-1 : ( i > ids.長さ ? 0 : i-1 )]); iv.setScaleType(ImageView.ScaleType.FIT_XY); setCurrentItem(1); // ホーム ページ this.adapter.notifyDataSetChanged(); } @Override public void setOnPageChangeListener(OnPageChangeListener) { this.listener2 = リスナー; }