package com.wm.remusic.widget; import android.content.Context; import android.graphics.drawable.Animatable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.AsyncTask; import android.os.Handler; import android.os.Message; import android.os.Parcelable; import android.support.annotation.Nullable; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ImageView; import com.facebook.common.logging.FLog; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.drawee.controller.BaseControllerListener; import com.facebook.drawee.controller.ControllerListener; import com.facebook.drawee.interfaces.DraweeController; import com.facebook.drawee.view.SimpleDraweeView; import com.facebook.imagepipeline.image.ImageInfo; import com.facebook.imagepipeline.image.QualityInfo; import com.facebook.imagepipeline.request.ImageRequest; import com.facebook.imagepipeline.request.ImageRequestBuilder; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.wm.remusic.R; import com.wm.remusic.json.FocusItemInfo; import com.wm.remusic.net.BMA; import com.wm.remusic.net.HttpUtil; import com.wm.remusic.net.NetworkUtils; import com.wm.remusic.service.MusicPlayer; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * Created by muyang on 2016/3/24. */ public class LoodView extends FrameLayout { //轮播图图片数量 private final static int IMAGE_COUNT = 7; //自动轮播时间间隔 private final static int TIME_INTERVAL = 3; //自动轮播启用开关 private final static boolean isAutoPlay = true; //ImageView资源ID private int[] imageResIds; private FPagerAdapter fPagerAdapter; private ArrayList<String> imageNet = new ArrayList<>(); private List<ImageView> imageViewList; private List<View> dotViewList; private ViewPager viewPager; private boolean isFromCache = true; private Context mContext; //当前轮播页面 private int currentItem = 0; //定时任务 private ScheduledExecutorService scheduledExecutorService; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); viewPager.setCurrentItem(currentItem); } }; public LoodView(Context context) { super(context); mContext = context; } public LoodView(Context context, AttributeSet attributeSet) { this(context, attributeSet, 0); mContext = context; } public LoodView(Context context, AttributeSet attributeSet, int defStyle) { super(context, attributeSet, defStyle); mContext = context; initImageView(); initUI(context); if (isAutoPlay) { startPlay(); } } public void onDestroy(){ scheduledExecutorService.shutdownNow(); scheduledExecutorService = null; } /** * 开始轮播图切换 */ public void startPlay() { scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); scheduledExecutorService.scheduleAtFixedRate(new LoopTask(), 1, TIME_INTERVAL, TimeUnit.SECONDS); } /** * 停止切换 */ private void stopPlay() { scheduledExecutorService.shutdown(); } /** * 初始化UI * * @param context */ private void initUI(Context context) { LayoutInflater.from(context).inflate(R.layout.load_view, this, true); for (String imagesID : imageNet) { final SimpleDraweeView mAlbumArt = new SimpleDraweeView(context); ControllerListener controllerListener = new BaseControllerListener<ImageInfo>() { @Override public void onFinalImageSet(String id, @Nullable ImageInfo imageInfo, @Nullable Animatable anim) { if (imageInfo == null) { return; } QualityInfo qualityInfo = imageInfo.getQualityInfo(); FLog.d("Final image received! " + "Size %d x %d", "Quality level %d, good enough: %s, full quality: %s", imageInfo.getWidth(), imageInfo.getHeight(), qualityInfo.getQuality(), qualityInfo.isOfGoodEnoughQuality(), qualityInfo.isOfFullQuality()); } @Override public void onIntermediateImageSet(String id, @Nullable ImageInfo imageInfo) { //FLog.d("Intermediate image received"); } @Override public void onFailure(String id, Throwable throwable) { mAlbumArt.setImageURI(Uri.parse("res:/" + R.drawable.placeholder_disk_210)); } }; Uri uri = null; try{ uri = Uri.parse(imagesID); }catch (Exception e){ e.printStackTrace(); } if (uri != null) { ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri).build(); DraweeController controller = Fresco.newDraweeControllerBuilder() .setOldController(mAlbumArt.getController()) .setImageRequest(request) .setControllerListener(controllerListener) .build(); mAlbumArt.setController(controller); } else { mAlbumArt.setImageURI(Uri.parse("res:/" + R.drawable.placeholder_disk_210)); } //view.setImageURI(Uri.parse(imagesID)); // view.setImageResource(imagesID); // view.setImageResource(imagesID); mAlbumArt.setScaleType(ImageView.ScaleType.CENTER_CROP); imageViewList.add(mAlbumArt); } dotViewList.add(findViewById(R.id.v_dot1)); dotViewList.add(findViewById(R.id.v_dot2)); dotViewList.add(findViewById(R.id.v_dot3)); dotViewList.add(findViewById(R.id.v_dot4)); dotViewList.add(findViewById(R.id.v_dot5)); dotViewList.add(findViewById(R.id.v_dot6)); dotViewList.add(findViewById(R.id.v_dot7)); viewPager = (ViewPager) findViewById(R.id.viewPager); viewPager.setFocusable(true); fPagerAdapter = new FPagerAdapter(); viewPager.setAdapter(fPagerAdapter); viewPager.addOnPageChangeListener(new MyPageChangeListener()); } private void initImageView() { imageResIds = new int[]{ R.mipmap.first, R.mipmap.second, R.mipmap.third, R.mipmap.fourth, R.mipmap.five, R.mipmap.six, R.mipmap.seven }; new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { if (NetworkUtils.isConnectInternet(mContext)) { isFromCache = false; } try { JsonArray rray = HttpUtil.getResposeJsonObject(BMA.focusPic(7), mContext, isFromCache).get("pic").getAsJsonArray(); int en = rray.size(); Gson gson = new Gson(); imageNet.clear(); for (int i = 0; i < en; i++) { FocusItemInfo focusItemInfo = gson.fromJson(rray.get(i), FocusItemInfo.class); if (focusItemInfo != null) { imageNet.add(focusItemInfo.getRandpic()); } else { imageNet.add(""); } } } catch (NullPointerException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void aVoid) { for (int i = 0; i < 7; i++) { imageViewList.get(i).setImageURI(Uri.parse(imageNet.get(i))); } } }.execute(); for (int i = 0; i < 7; i++) { imageNet.add(""); } imageViewList = new ArrayList<>(); dotViewList = new ArrayList<>(); } private class FPagerAdapter extends PagerAdapter { @Override public Object instantiateItem(ViewGroup container, int position) { container.addView(imageViewList.get(position)); return imageViewList.get(position); } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(imageViewList.get(position)); } @Override public int getCount() { return imageViewList.size(); } @Override public void restoreState(Parcelable state, ClassLoader loader) { super.restoreState(state, loader); } @Override public Parcelable saveState() { return null; } @Override public void startUpdate(ViewGroup container) { super.startUpdate(container); } @Override public void finishUpdate(ViewGroup container) { super.finishUpdate(container); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } } private class MyPageChangeListener implements ViewPager.OnPageChangeListener { boolean isAutoPlay = false; @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { currentItem = position; for (int i = 0; i < dotViewList.size(); i++) { if (i == position) { dotViewList.get(i).setBackgroundResource(R.mipmap.red_point); } else { dotViewList.get(i).setBackgroundResource(R.mipmap.grey_point); } } } @Override public void onPageScrollStateChanged(int state) { switch (state) { //手势滑动,空闲 case 1: isAutoPlay = false; stopPlay(); startPlay(); break; //界面切换中 case 2: isAutoPlay = true; break; //滑动完毕,继续回到第一张图 case 0: if (viewPager.getCurrentItem() == viewPager.getAdapter().getCount() - 1 && !isAutoPlay) { viewPager.setCurrentItem(0); } //当前为第一张,从左向右滑 else if (viewPager.getCurrentItem() == 0 && !isAutoPlay) { viewPager.setCurrentItem(viewPager.getAdapter().getCount() - 1); } break; } } } //解决滑动冲突 @Override public boolean dispatchTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: { getParent().requestDisallowInterceptTouchEvent(true); break; } case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: break; } return super.dispatchTouchEvent(ev); } private class LoopTask implements Runnable { @Override public void run() { synchronized (viewPager) { currentItem = (currentItem + 1) % imageViewList.size(); handler.obtainMessage().sendToTarget(); } } } /** * 销毁ImageView回收资源 */ private void destoryBitmaps() { for (int i = 0; i < IMAGE_COUNT; i++) { ImageView imageView = imageViewList.get(i); Drawable drawable = imageView.getDrawable(); if (drawable != null) //解除drawable对view的引用 drawable.setCallback(null); } } }