Android实现炫酷轮播图效果

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

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

底层封装的我在下面会一一展示,先看下在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);

 }
}

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

注意点:

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

下载demo

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

(0)

相关推荐

  • Android自定义控件实现简单的轮播图控件

    最近要做一个轮播图的效果,网上看了几篇文章,基本上都能找到实现,效果还挺不错,但是在写的时候感觉每次都要单独去重新在Activity里写一堆代码.于是自己封装了一下.本篇轮播图实现原理原文出处:循环广告位组件的实现,这里只是做了下封装成一个控件,不必每次重复写代码了. 效果图: 实现分析 轮播图的功能就是实现左右滑动的广告.图片信息展示,那我们就用ViewPager来实现,由于考虑到用户体验,我们还需要在下面加一个指示器来标示滑动到了第几张轮播图.指示器我们可以用一个线性布局来根据要展示的轮播图

  • Android实现ViewPage轮播图效果

    在android移动端的开发中,首页轮播图是一个特别常见的功能,所以今天就来将最近写的一个小demo记录一下. 首先当然是新建一个项目代码如下: activity_main.xml文件: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:to

  • Android ViewPager实现轮播图效果

    先上一张效果图: 说到ViewPager实现轮播图效果,那么肯定会用到PagerAdapter,下面先介绍下这个类. PagerAdapter简介 PagerAdapter是Android.support.v4包中的类,是一个抽象类,直接继承于Object,导入包android.support.v4.view.PagerAdapter即可使用. PagerAdapter主要是viewpager的适配器,而viewPager则也是在android.support.v4扩展包中新添加的一个强大的控件

  • Android实现自定义轮播图片控件示例

    要完成一个轮播图片,首先想到的应该是使用ViewPager来实现.ViewPager已经有了滑动的功能,我们只要让它自己滚动.再加上下方的小圆点就行了.所以我们本次的自定义控件就是由ViewPager和LinearLayout叠加起来组成的. 直接先上效果图: 创建一个自定义的ViewPager 先上完整的代码 package com.kcode.autoscrollviewpager.view; import android.content.Context; import android.os

  • Android自定义控件实现优雅的广告轮播图

    前言 今天给大家带来一个新的控件–轮播图,网上已经有很多这类的博客来讲解如何实现的,那么我的这个有哪些特点呢?或是说有哪些不同呢? 满足了轮播图的基本要求,循环滑动,在最后一张切到第一张时可以平稳的过渡 简洁简洁简洁 扩展性强 如何使用 下面我们先展示两种效果图 1 默认效果 代码实现 //布局代码 <com.landptf.view.BannerM android:id="@+id/bm_banner" android:layout_width="match_pare

  • Android轮播图点击图片放大效果的实现方法

    前言 最近项目中需要实现轮播图显示商品图片,当用户点击商品图片的时候,需要图片放大显示,当然用户还能进行多张图片的滑动切换,放大,缩小图片等操作,实现起来相对还是比较简单的,话不多说,咱们是用代码说话的,直接上代码. 实现步骤: 1.效果图的展示 2.项目中添加相关的依赖 3.主界面实现轮播图的效果 4.点击轮播图进入图片放大展示页面 5.图片放大展示页面所需的适配器 6.获取fragment需要展示图片的url 7.图片缩放时遇到Bug解决 实现过程: 1.效果图的展示 2.项目中添加相关的依

  • Android实现轮播图片展示效果

    本文实例为大家分享了Android轮播图片的展示,供大家参考,具体内容如下 实现逻辑 1.创建XML布局文件,使用ViewPager完成轮播图片 2.初始化ViewPager控件,然后为控件设置适配器,创建出来的适配器实现里面的四个方法 3.四个方法分别是getCount isViewFromObject instantiateItem destroyItem 4.在onCreat方法中,加载图片资源,将图片ID存在集合中,使图片能够在页面中显示,(图片之所以能够在页面中显示,是因为在适配器中的

  • Android开发在轮播图片上加入点击事件的方法

    这是我加在里面的代码,用Switch(position) 来获取当前图片,在相应的图片上加入点击事件, case  0:, case 1: 时代码如下,当点击第一张图片时,想实现case 0里面的代码,但是直接直接报错,退出,当点击第二张实现case 1中的代码时却是没问题,我想知道到底哪里不对啊. 对了,这些代码是在Fragemnt内写的,点击图片时是要从一个Fragment转到一个Activity,求大神指教

  • Android开发实现的自动换图片、轮播图效果示例

    本文实例讲述了Android开发实现的自动换图片.轮播图效果.分享给大家供大家参考,具体如下: 50行代码急速实现轮播图: 先看效果: 两个例子没太大区别, 不过i是布局文件中控件的Height不一样罢了这里一第二个为例: public class MainActivity extends Activity { int[] imageIds = new int[]{ R.drawable.a00,R.drawable.a01,R.drawable.a02,R.drawable.a3,R.draw

  • Android实现自定义轮播图片控件详解

    首先上效果图 实现原理 要完成一个轮播图片,首先想到的应该是使用ViewPager来实现.ViewPager已经有了滑动的功能,我们只要让它自己滚动.再加上下方的小圆点就行了.所以我们本次的自定义控件就是由ViewPager和LinearLayout叠加起来组成的. 一.创建一个自定义的ViewPager 先上完整的代码 package com.kcode.autoscrollviewpager.view; import android.content.Context; import andro

随机推荐