Android實(shí)現(xiàn)炫酷輪播圖效果
輪播圖的實(shí)現(xiàn)有很多種方式,早先我在網(wǎng)上看了下別人寫的輪播圖,感覺都比較的墨守成規(guī),有的還有可能加載不了網(wǎng)絡(luò)圖片。所以我在這里自己重新寫了下輪播圖 ,方便日后的項(xiàng)目使用.
在下面的代碼中,我也用volley封裝了網(wǎng)絡(luò)請求框架,異步加載網(wǎng)絡(luò)圖片,也可以給大家參考,非常實(shí)用。
效果圖:這只是其中的一種效果

底層封裝的我在下面會(huì)一一展示,先看下在MainActivity中怎樣調(diào)取這個(gè)輪播控件
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() {
/**
* 獲取接口返回的輪播圖地址,獲取的部分我已經(jīng)注釋掉了,可以使用。我在這里就直接弄了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直接去找這個(gè)類就行在flashView框架中,同時(shí)修改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) {
// /**在此處將服務(wù)器返回的輪播圖地址一個(gè)一個(gè)放入imageUrls中*/
// flashView.setImageUris(imageUrls);
// /** (wujie)增加代碼 usage:需要什么類型falshView直接去找這個(gè)類就行在flashView框架中,同時(shí)修改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();
/**
* 設(shè)置監(jiān)聽
*/
protected abstract void initListener();
/**
* 初始化數(shù)據(jù)
*/
protected abstract void initData();
/**
* 吐司
*/
public void showShortToast(String toast) {
Toast.makeText(this, toast, Toast.LENGTH_SHORT).show();
}
}
那么下面我就來封裝Volley請求網(wǎng)絡(luò)數(shù)據(jù)框架,封裝好了之后,調(diào)用在MainActivity中有體現(xiàn)。
首先,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:非帶參數(shù)*/
public static VolleyRequest newInstance() {
if (mRequestQueue == null) {
throw new NullPointerException("Call buildRequestQueue method first.");
}
//...
return new VolleyRequest();
}
/** (WangShuJie)增加代碼 usage:帶參數(shù)*/
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","響應(yīng)====="+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數(shù)據(jù)*/
public static Map<String,String> getAdnertisment(String city,String token){
Map<String,String> mMap=new HashMap<>();
mMap.put("city_name",city);//這個(gè)key是你要上傳參數(shù)的的key,服務(wù)器通過這個(gè)key來獲取客戶端穿的參數(shù)。
mMap.put("token",token);
return mMap;
}
}
封裝好后,我們要將Volley請求加入到隊(duì)列中(初始化):
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) //設(shè)置內(nèi)存的緩存
.diskCacheSize(50 * 1024 * 1024) //設(shè)置磁盤緩存的大小
.threadPoolSize(4) //設(shè)置線程池的大小是多少
.build();
//設(shè)置配置信息this
// ImageLoader.getInstance().init(new ImageLoaderConfiguration.Builder(this).build());
ImageLoader.getInstance().init(configuration);
// ImageLoaderConfiguration aDefault = ImageLoaderConfiguration.createDefault(this);
}
}
到此為止,網(wǎng)絡(luò)請求框架就封裝好了,下面就是輪播圖的實(shí)現(xiàn),因?yàn)榇a文件比較多,我就不一一列舉出來了,如果大家有需要可以找我要整個(gè)代碼。

注意點(diǎn):
1. 輪播圖圖片描述字體資源文件的導(dǎo)入
2. 網(wǎng)絡(luò)請求框架的初始化
下載demo
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)輪播圖片展示效果
- Android使用viewpager實(shí)現(xiàn)自動(dòng)無限輪播圖
- Android實(shí)現(xiàn)ViewPage輪播圖效果
- Android ViewPager實(shí)現(xiàn)輪播圖效果
- Android開發(fā)實(shí)現(xiàn)的自動(dòng)換圖片、輪播圖效果示例
- Android如何使用RecyclerView打造首頁輪播圖
- android實(shí)現(xiàn)banner輪播圖無限輪播效果
- 簡單實(shí)現(xiàn)android輪播圖
- Android自定義控件實(shí)現(xiàn)優(yōu)雅的廣告輪播圖
- Android自定義輪播圖效果
相關(guān)文章
Android?自定義View?加?lifecycle?簡單使用詳解
本文介紹了自定義View的基本使用方法,包括onMeasure、onDraw、自定義樣式和lifecycle的使用,通過了解MeasureSpec的作用和lifecycle的控制,可以更好地管理View的生命周期,避免內(nèi)存泄露問題,感興趣的朋友一起看看吧2025-03-03
Android Mms之:對話與聯(lián)系人關(guān)聯(lián)的總結(jié)詳解
本篇文章是對Android中對話與聯(lián)系人的關(guān)聯(lián)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
Android Studio中使用lambda表達(dá)式的方法
這篇文章主要介紹了Android Studio中使用lambda表達(dá)式的方法,需要的朋友可以參考下2017-06-06
Android使用WindowManager構(gòu)造懸浮view
這篇文章主要為大家詳細(xì)介紹了Android使用WindowManager構(gòu)造懸浮view的具體方法,感興趣的小伙伴們可以參考一下2016-05-05
常見的8個(gè)Android內(nèi)存泄漏問題及解決方法
在Android開發(fā)中,內(nèi)存泄漏是一個(gè)常見的問題,這個(gè)問題可能會(huì)導(dǎo)致應(yīng)用程序變慢、崩潰或者消耗大量的內(nèi)存,最終導(dǎo)致設(shè)備性能下降,本文就給大家總結(jié)一下最常見的8個(gè)Android內(nèi)存泄漏問題及解決方法,需要的朋友可以參考下2023-07-07
Android開發(fā)之如何自定義數(shù)字鍵盤詳解
這篇文章主要給大家介紹了關(guān)于Android開發(fā)之如何自定義數(shù)字鍵盤的相關(guān)資料,本文語言是基于kotlin實(shí)現(xiàn)的,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-09-09
Android開發(fā)中的Surface庫及用其制作播放器UI的例子
這篇文章主要介紹了Android開發(fā)中的Surface庫及用其制作播放器界面的例子,利用SurfaceView和SurfaceHolder可以高效地繪制和控制圖形界面,需要的朋友可以參考下2016-04-04

