Selaa lähdekoodia

添加首页banner

316044749 7 vuotta sitten
vanhempi
commit
e36efcee78

+ 60 - 0
app/src/main/java/com/ynstkz/shitu/android/adapter/HomeBannerAdapter.java

@@ -0,0 +1,60 @@
+package com.ynstkz.shitu.android.adapter;
+
+import android.content.Context;
+import android.support.v4.view.PagerAdapter;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+import com.bumptech.glide.Glide;
+import com.ynstkz.shitu.android.R;
+import com.ynstkz.shitu.android.bean.HomeBannerBean;
+import com.ynstkz.shitu.android.exter.GlideRoundTransform;
+
+import java.util.List;
+
+/**
+ * 作者:fuchangle on 2018/2/24 10:30
+ */
+
+public class HomeBannerAdapter extends PagerAdapter{
+
+    private Context context;
+    private List<HomeBannerBean.DataBean> listDatas;
+
+    public HomeBannerAdapter(Context context, List<HomeBannerBean.DataBean> listDatas){
+        this.context = context;
+        this.listDatas = listDatas;
+    }
+
+    @Override
+    public int getCount() {
+        return listDatas.size();
+    }
+
+    @Override
+    public int getItemPosition(Object object) {
+        return PagerAdapter.POSITION_UNCHANGED;
+    }
+
+
+
+    @Override
+    public boolean isViewFromObject(View view, Object object) {
+        return view == object;
+    }
+
+    @Override
+    public void destroyItem(ViewGroup container, int position, Object object) {
+        container.removeView((ImageView) object);
+    }
+
+    @Override
+    public Object instantiateItem(ViewGroup container, int position) {
+        ImageView imageView = (ImageView) LayoutInflater.from(context).inflate(R.layout.item_home_banner_img,null);
+        Glide.with(context).load(listDatas.get(position).getUrl()).into(imageView);
+        container.addView(imageView);
+        return imageView;
+    }
+}

+ 71 - 0
app/src/main/java/com/ynstkz/shitu/android/bean/HomeBannerBean.java

@@ -0,0 +1,71 @@
+package com.ynstkz.shitu.android.bean;
+
+import com.google.gson.annotations.SerializedName;
+import com.ynstkz.shitu.android.base.BaseBean;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 作者:fuchangle on 2018/2/23 21:46
+ */
+
+public class HomeBannerBean extends BaseBean{
+
+
+    private List<DataBean> data;
+
+    public List<DataBean> getData() {
+        return data;
+    }
+
+    public void setData(List<DataBean> data) {
+        this.data = data;
+    }
+
+    public static class DataBean implements Serializable{
+        /**
+         * bannerId : 1
+         * url : http://img.taopic.com/uploads/allimg/140118/234951-14011Q32Z561.jpg
+         * title : 手机大卖
+         * desc : 手机广告
+         */
+
+        private int bannerId;
+        private String url;
+        private String title;
+        private String desc;
+
+        public int getBannerId() {
+            return bannerId;
+        }
+
+        public void setBannerId(int bannerId) {
+            this.bannerId = bannerId;
+        }
+
+        public String getUrl() {
+            return url;
+        }
+
+        public void setUrl(String url) {
+            this.url = url;
+        }
+
+        public String getTitle() {
+            return title;
+        }
+
+        public void setTitle(String title) {
+            this.title = title;
+        }
+
+        public String getDesc() {
+            return desc;
+        }
+
+        public void setDesc(String desc) {
+            this.desc = desc;
+        }
+    }
+}

+ 55 - 0
app/src/main/java/com/ynstkz/shitu/android/exter/GlideRoundTransform.java

@@ -0,0 +1,55 @@
+package com.ynstkz.shitu.android.exter;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapShader;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.RectF;
+
+import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
+import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
+
+/**
+ * 作者:fuchangle on 2018/2/24 11:42
+ */
+
+public class GlideRoundTransform extends BitmapTransformation {
+
+    private static float radius = 0f;
+
+    public GlideRoundTransform(Context context) {
+        this(context, 4);
+    }
+
+    public GlideRoundTransform(Context context, int dp) {
+        super(context);
+        this.radius = Resources.getSystem().getDisplayMetrics().density * dp;
+    }
+
+    @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
+        return roundCrop(pool, toTransform);
+    }
+
+    private static Bitmap roundCrop(BitmapPool pool, Bitmap source) {
+        if (source == null) return null;
+
+        Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
+        if (result == null) {
+            result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
+        }
+
+        Canvas canvas = new Canvas(result);
+        Paint paint = new Paint();
+        paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
+        paint.setAntiAlias(true);
+        RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());
+        canvas.drawRoundRect(rectF, radius, radius, paint);
+        return result;
+    }
+
+    @Override public String getId() {
+        return getClass().getName() + Math.round(radius);
+    }
+}

+ 136 - 9
app/src/main/java/com/ynstkz/shitu/android/fragment/HomeFragment.java

@@ -1,8 +1,15 @@
 package com.ynstkz.shitu.android.fragment;
 
+import android.annotation.SuppressLint;
 import android.content.Intent;
 import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.support.v4.view.ViewCompat;
 import android.support.v4.view.ViewPager;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -11,19 +18,28 @@ import android.widget.LinearLayout;
 import android.widget.ScrollView;
 import android.widget.TextView;
 
+import com.common.library.okhttp.callback.Callback;
 import com.common.library.pulltorefresh.PullToRefreshBase;
 import com.common.library.pulltorefresh.PullToRefreshScrollView;
+import com.google.gson.Gson;
 import com.ynstkz.shitu.android.R;
 import com.ynstkz.shitu.android.activity.LocationSelectActivity;
+import com.ynstkz.shitu.android.adapter.HomeBannerAdapter;
 import com.ynstkz.shitu.android.base.BaseFragment;
+import com.ynstkz.shitu.android.bean.HomeBannerBean;
+import com.ynstkz.shitu.android.data.RequestGroup;
 import com.ynstkz.shitu.android.event.LocationChangedEvent;
 
 import org.greenrobot.eventbus.EventBus;
 import org.greenrobot.eventbus.Subscribe;
 import org.greenrobot.eventbus.ThreadMode;
 
+import java.util.List;
+
 import butterknife.Bind;
 import butterknife.ButterKnife;
+import okhttp3.Call;
+import okhttp3.Response;
 
 /**
  * 作者:fuchangle on 2018/1/29 11:38
@@ -42,26 +58,31 @@ public class HomeFragment extends BaseFragment implements PullToRefreshBase.OnRe
     @Bind(R.id.ll_location_select)
     LinearLayout llLocationSelect;
 
+    //banner
+    private final int BANNER_DELAYED = 3000;
+    private List<HomeBannerBean.DataBean> listBanner;
+    private int bannerIndex;
+
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         View view = inflater.inflate(R.layout.fm_home, null);
         ButterKnife.bind(this, view);
         initView();
+        initData();
         setListener();
         return view;
     }
 
-    @Override
-    public void onDestroyView() {
-        super.onDestroyView();
-        ButterKnife.unbind(this);
-    }
-
     private void initView() {
         EventBus.getDefault().register(this);
         svMain.setOnRefreshListener(this);
     }
 
+    private void initData(){
+        //获取banner
+        getBannerData();
+    }
+
     private void setListener() {
 
         viewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@@ -72,7 +93,7 @@ public class HomeFragment extends BaseFragment implements PullToRefreshBase.OnRe
 
             @Override
             public void onPageSelected(int position) {
-
+                bannerIndex = position;
             }
 
             @Override
@@ -90,6 +111,111 @@ public class HomeFragment extends BaseFragment implements PullToRefreshBase.OnRe
         });
     }
 
+    /**
+     * 获取banner数据
+     */
+    private void getBannerData(){
+
+        RequestGroup.getBannerList(new Callback() {
+            @Override
+            public Object parseNetworkResponse(Response response, int id) throws Exception {
+                return new Gson().fromJson(response.body().string(), HomeBannerBean.class);
+            }
+
+            @Override
+            public void onError(Call call, Exception e, int id) {
+                showToast(getActivity(), getString(R.string.error_msg));
+            }
+
+            @Override
+            public void onResponse(Object response, int id) {
+                HomeBannerBean bannerBean = (HomeBannerBean)response;
+                if(bannerBean != null){
+                    if("200".equals(bannerBean.getCode())){
+                        if(bannerBean.getData() != null){
+                            List<HomeBannerBean.DataBean> listData = bannerBean.getData();
+                            listBanner = listData;
+                            initBannerView();
+                        }
+                    } else {
+                        showToast(getActivity(), bannerBean.getMsg());
+                    }
+                }
+            }
+        });
+    }
+
+    /**
+     * 初始化Banner数据
+     */
+    private void initBannerView(){
+        if(listBanner == null || listBanner.size() == 0){
+            return;
+        }
+        DisplayMetrics metrics = new DisplayMetrics();
+        getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
+        viewpager.setPageMargin((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 25, metrics));
+        viewpager.setPageTransformer(true, new MyPageTransform());
+        viewpager.setOffscreenPageLimit(listBanner.size());
+
+        HomeBannerAdapter homeBannerAdapter = new HomeBannerAdapter(getActivity(), listBanner);
+        viewpager.setAdapter(homeBannerAdapter);
+        bannerIndex = 0;
+        viewpager.setCurrentItem(bannerIndex);
+        handler.sendEmptyMessageDelayed(10, BANNER_DELAYED);
+    }
+
+    class MyPageTransform implements ViewPager.PageTransformer {
+
+        final float SCALE_MAX = 0.8f;
+        final float ALPHA_MAX = 0.5f;
+
+        @Override
+        public void transformPage(View page, float position) {
+            if ((int) position < -1 || (int) position > 1) {
+                return;
+            }
+
+            float scale = (position < 0)
+                    ? ((1 - SCALE_MAX) * position + 1)
+                    : ((SCALE_MAX - 1) * position + 1);
+            float alpha = (position < 0)
+                    ? ((1 - ALPHA_MAX) * position + 1)
+                    : ((ALPHA_MAX - 1) * position + 1);
+            if (position < 0) {
+                ViewCompat.setPivotX(page, page.getWidth());
+                ViewCompat.setPivotY(page, page.getHeight() / 2);
+            } else {
+                ViewCompat.setPivotX(page, 0);
+                ViewCompat.setPivotY(page, page.getHeight() / 2);
+            }
+            Log.d("error", "position: " + position + ",scale:" + scale);
+
+            ViewCompat.setScaleX(page, scale);
+            ViewCompat.setScaleY(page, scale);
+            ViewCompat.setAlpha(page, Math.abs(alpha));
+        }
+    }
+
+    @SuppressLint("HandlerLeak")
+    Handler handler = new Handler(){
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what){
+                case 10:
+                    bannerIndex ++;
+                    if(bannerIndex < listBanner.size()){
+                        viewpager.setCurrentItem(bannerIndex);
+                    } else {
+                        viewpager.setCurrentItem(0);
+                        bannerIndex = 0;
+                    }
+                    handler.sendEmptyMessageDelayed(10, BANNER_DELAYED);
+                    break;
+            }
+        }
+    };
+
     @Subscribe(threadMode = ThreadMode.MAIN)
     public void onMessageEvent(LocationChangedEvent event) {
         tvLocation.setText(event.getAmapLocation().getDistrict());
@@ -113,8 +239,9 @@ public class HomeFragment extends BaseFragment implements PullToRefreshBase.OnRe
     }
 
     @Override
-    public void onDestroy() {
-        super.onDestroy();
+    public void onDestroyView() {
+        super.onDestroyView();
+        ButterKnife.unbind(this);
         EventBus.getDefault().unregister(this);
     }
 }

+ 4 - 3
app/src/main/res/layout/fm_home.xml

@@ -27,12 +27,13 @@
            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="200dp"
-               android:background="@color/white">
+               android:background="@color/white"
+               android:clipChildren="false">
 
                <android.support.v4.view.ViewPager
                    android:id="@+id/viewpager"
-                   android:layout_width="300dp"
-                   android:layout_height="match_parent"
+                   android:layout_width="280dp"
+                   android:layout_height="180dp"
                    android:layout_centerInParent="true"
                    android:clipChildren="false"/>
 

+ 8 - 0
app/src/main/res/layout/item_home_banner_img.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="184dp"
+    android:layout_height="match_parent"
+    android:scaleType="centerCrop">
+
+</ImageView>