首页 > 系统 > Android > 正文

Android实现炫酷轮播图效果

2019-10-21 21:41:15
字体:
来源:转载
供稿:网友

轮播图的实现有很多种方式,早先我在网上看了下别人写的轮播图,感觉都比较的墨守成规,有的还有可能加载不了网络图片。所以我在这里自己重新写了下轮播图 ,方便日后的项目使用. 
在下面的代码中,我也用volley封装了网络请求框架,异步加载网络图片,也可以给大家参考,非常实用。

效果图:这只是其中的一种效果 

Android,轮播图

底层封装的我在下面会一一展示,先看下在MainActivity中怎样调取这个轮播控件

package com.wujie.advertisment.activity;import android.view.View;import com.wujie.advertisment.R;import com.wujie.advertisment.flashview.EffectConstants;import com.wujie.advertisment.flashview.FlashView;import java.util.ArrayList;public class MainActivity extends BaseActivity { private FlashView flashView; private ArrayList<String> imageUrls=new ArrayList<String>(); @Override protected void initView() {  setContentView(R.layout.activity_main);  flashView=(FlashView)findViewById(R.id.flash_view); } @Override protected void initListener() { } @Override protected void initData() {/** * 获取接口返回的轮播图地址,获取的部分我已经注释掉了,可以使用。我在这里就直接弄了4张图片 */   imageUrls.add("1303680113,133301350&fm=21&gp=0.jpg");   imageUrls.add("1350614941,725003865&fm=21&gp=0.jpg");   imageUrls.add("3293842903,1040789920&fm=21&gp=0.jpg");   imageUrls.add(",1368131788&fm=21&gp=0.jpg");    flashView.setImageUris(imageUrls);  /** (wujie)增加代码 usage:需要什么类型falshView直接去找这个类就行在flashView框架中,同时修改View中的flashView注释的那块*/    flashView.setEffect(EffectConstants.CUBE_EFFECT);//  VolleyRequest.newInstance(IpAddressConstants.getAdnertisment("","")).newGsonRequest2(Request.Method.POST,IpAddressConstants.ADVERTISMENT_URL, Advertisment.class,//    new Response.Listener<Advertisment>() {//     @Override//     public void onResponse(Advertisment dvertisment) {//      /**在此处将服务器返回的轮播图地址一个一个放入imageUrls中*///      flashView.setImageUris(imageUrls);//      /** (wujie)增加代码 usage:需要什么类型falshView直接去找这个类就行在flashView框架中,同时修改View中的flashView注释的那块*///      flashView.setEffect(EffectConstants.CUBE_EFFECT);//     }//    }, new Response.ErrorListener() {//     @Override//     public void onErrorResponse(VolleyError volleyError) {////     }//    }); } @Override public void onClick(View view) { }}

MainActivity继承的BaseActivity:

package com.wujie.advertisment.activity;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.view.Window;import android.widget.Toast;/** * <pre> * Company: * Author : wujie * Time : 2016/11 * Usage : 所有自定义activity的父类 * desc : * other : * </pre> */public abstract class BaseActivity extends AppCompatActivity implements View.OnClickListener{ @Override protected void onCreate(@Nullable Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  supportRequestWindowFeature(Window.FEATURE_NO_TITLE);  initView();  initData();  initListener(); } /**  * 初始化控件  */ protected abstract void initView(); /**  * 设置监听  */ protected abstract void initListener(); /**  * 初始化数据  */ protected abstract void initData(); /**  * 吐司  */ public void showShortToast(String toast) {  Toast.makeText(this, toast, Toast.LENGTH_SHORT).show(); }}

那么下面我就来封装Volley请求网络数据框架,封装好了之后,调用在MainActivity中有体现。 
首先,VolleyRequest类如下:

 

package com.wujie.advertisment.volley;import android.content.Context;import android.util.Log;import com.android.volley.RequestQueue;import com.android.volley.Response;import com.android.volley.toolbox.Volley;import java.util.HashMap;import java.util.Map;/** * 请求类 */public class VolleyRequest { private static RequestQueue mRequestQueue; private Map<String,String> mMap=new HashMap<>(); private VolleyRequest() { } private VolleyRequest(Map<String,String> mMap) {  this.mMap=mMap; } /**  * @param context ApplicationContext  */ public static void buildRequestQueue(Context context) {  mRequestQueue = Volley.newRequestQueue(context);  //... do something } /** (WangShuJie)增加代码 usage:非带参数*/ public static VolleyRequest newInstance() {  if (mRequestQueue == null) {   throw new NullPointerException("Call buildRequestQueue method first.");  }  //...  return new VolleyRequest(); } /** (WangShuJie)增加代码 usage:带参数*/ public static VolleyRequest newInstance(Map<String,String> mMap) {  if (mRequestQueue == null) {   throw new NullPointerException("Call buildRequestQueue method first.");  }  //...  Log.i("mtag","newInstance==========="+mMap.get("goodsname"));  return new VolleyRequest(mMap); } /**  * @param url  * @param clazz  * @param listener  * @param errorListener  *带参  * @return  */ public <T> GsonRequest<T> newGsonRequest2(int method, String url, Class<T> clazz, Response.Listener<T> listener,            Response.ErrorListener errorListener) {  GsonRequest<T> request = new GsonRequest(method,url, clazz, listener, errorListener){   @Override   protected Map<String, String> getParams() {    Log.i("mtag","getParams==========="+mMap.get("goodsname"));    return mMap;   }  };  mRequestQueue.add(request);  return request; } /** (wujie)增加代码 usage:不带参的*/ public <T> GsonRequest<T> newGsonRequest(String url, Class<T> clazz, Response.Listener<T> listener,            Response.ErrorListener errorListener) {  GsonRequest<T> request = new GsonRequest(url, clazz, listener, errorListener);  mRequestQueue.add(request);  return request; }}

GsonRequest类:

 

package com.wujie.advertisment.volley;import android.util.Log;import com.android.volley.NetworkResponse;import com.android.volley.ParseError;import com.android.volley.Request;import com.android.volley.Response;import com.android.volley.Response.ErrorListener;import com.android.volley.Response.Listener;import com.android.volley.toolbox.HttpHeaderParser;import com.google.gson.Gson;import com.google.gson.reflect.TypeToken;import java.io.UnsupportedEncodingException;public class GsonRequest<T> extends Request<T> { private final Listener<T> mListener; private static Gson mGson = new Gson(); private Class<T> mClass; private TypeToken<T> mTypeToken; public GsonRequest(int method, String url, Class<T> clazz, Listener<T> listener,      ErrorListener errorListener) {  super(method, url, errorListener);  mClass = clazz;  mListener = listener; } public GsonRequest(int method, String url, TypeToken<T> typeToken, Listener<T> listener,      ErrorListener errorListener) {  super(method, url, errorListener);  mTypeToken = typeToken;  mListener = listener; } public GsonRequest(String url, Class<T> clazz, Listener<T> listener, ErrorListener errorListener) {  this(Method.GET, url, clazz, listener, errorListener); } public GsonRequest(String url, TypeToken<T> typeToken, Listener<T> listener, ErrorListener errorListener) {  super(Method.GET, url, errorListener);  mTypeToken = typeToken;  mListener = listener; } @Override protected Response<T> parseNetworkResponse(NetworkResponse response) {  try {   String jsonString = new String(response.data,"UTF-8");   Log.i("mtag","响应====="+response.data);   if (mTypeToken == null)    return Response.success(mGson.fromJson(jsonString, mClass),      HttpHeaderParser.parseCacheHeaders(response));   else    return (Response<T>) Response.success(mGson.fromJson(jsonString, mTypeToken.getType()),      HttpHeaderParser.parseCacheHeaders(response));  } catch (UnsupportedEncodingException e) {   return Response.error(new ParseError(e));  } } @Override protected void deliverResponse(T response) {  mListener.onResponse(response); }}

管理接口的类:

package com.wujie.advertisment.volley;import java.util.HashMap;import java.util.Map;/** * author:wujie 2016/11 * usage: */public class IpAddressConstants { public static String MYIP="http://xxxxx:8080/"; /** ======轮播图====== */ public static final String ADVERTISMENT_URL=MYIP+"AppInterface/advert/indexAdvert"; /** (wujie)增加代码 usage:获取轮播图需要的Map数据*/ public static Map<String,String> getAdnertisment(String city,String token){  Map<String,String> mMap=new HashMap<>();  mMap.put("city_name",city);//这个key是你要上传参数的的key,服务器通过这个key来获取客户端穿的参数。  mMap.put("token",token);  return mMap; }}

封装好后,我们要将Volley请求加入到队列中(初始化):

package com.wujie.advertisment.application;import android.app.Application;import android.content.Context;import com.nostra13.universalimageloader.cache.memory.impl.LruMemoryCache;import com.nostra13.universalimageloader.core.ImageLoader;import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;import com.wujie.advertisment.volley.VolleyRequest;/** * <pre> * Company: xxx * Author : wujie * Time : 2016/11 * Usage : * desc : * other : * </pre> */public class MyApplication extends Application { public static Context mContext; @Override public void onCreate() {  super.onCreate();  mContext = getApplicationContext();  VolleyRequest.buildRequestQueue(this);  initImageLoader(); } private void initImageLoader() {  /**   * ImageLoader的全局的配置信息   */  ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(this)    .memoryCache(new LruMemoryCache(2 * 1024 * 1024))    .diskCacheFileCount(100)    .memoryCacheSize(2 * 1024 * 1024) //设置内存的缓存    .diskCacheSize(50 * 1024 * 1024) //设置磁盘缓存的大小    .threadPoolSize(4) //设置线程池的大小是多少    .build();  //设置配置信息this//  ImageLoader.getInstance().init(new ImageLoaderConfiguration.Builder(this).build());  ImageLoader.getInstance().init(configuration);//  ImageLoaderConfiguration aDefault = ImageLoaderConfiguration.createDefault(this); }}

到此为止,网络请求框架就封装好了,下面就是轮播图的实现,因为代码文件比较多,我就不一一列举出来了,如果大家有需要可以找我要整个代码。 

Android,轮播图

注意点: 

1. 轮播图图片描述字体资源文件的导入 
2. 网络请求框架的初始化

下载demo

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VEVB武林网。


注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表