自定义Banner轮播图片
生活随笔
收集整理的這篇文章主要介紹了
自定义Banner轮播图片
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
//activity_main
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.bwie.test.kaoshiti.MainActivity"><com.bwie.test.view.CustomBanner android:id="@+id/custom_banner" android:layout_width="match_parent" android:layout_height="wrap_content"></com.bwie.test.view.CustomBanner><Button android:layout_width="match_parent" android:layout_height="50dp" android:background="@drawable/btnbg" android:text="按鈕"/></LinearLayout>
//activity_details
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.bwie.test.view.DetailsActivity"><WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent"></WebView></RelativeLayout>
//banner_layout
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"><android.support.v4.view.ViewPager android:id="@+id/banner_view_pager" android:layout_width="match_parent" android:layout_height="200dp"></android.support.v4.view.ViewPager><LinearLayout android:id="@+id/linear_bannner" android:layout_centerHorizontal="true" android:layout_alignBottom="@+id/banner_view_pager" android:layout_marginBottom="10dp" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content"></LinearLayout></RelativeLayout>
drawable文件夾下//btnbg
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"><corners android:radius="20dp"></corners><gradient android:startColor="#f00" android:endColor="#f89" android:angle="45"/> </shape>
//shape_01
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"><!-- 顏色 --> <solid android:color="#f89"></solid><!-- 圓角 --> <corners android:radius="10dp"></corners><!-- 大小 --> <size android:height="10dp" android:width="10dp"></size> </shape>
//shape_02
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"><!-- 顏色 --> <solid android:color="#f00"></solid><!-- 圓角 --> <corners android:radius="10dp"></corners><!-- 大小 --> <size android:height="10dp" android:width="10dp"></size> </shape>
//MainActivity
public class MainActivity extends AppCompatActivity {private CustomBanner banner;List<String> list = new ArrayList<>();@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//需求 實現與banner一樣的輪播圖 banner = (CustomBanner) findViewById(R.id.custom_banner);//請求數據進行解析展示 getDataFromNet();}public void getDataFromNet() {OkHttp3Util.doGet("http://120.27.23.105/ad/getAd", new Callback() {@Override public void onFailure(Call call, IOException e) {}@Override public void onResponse(Call call, Response response) throws IOException {if (response.isSuccessful()) {String json = response.body().string();final DetalBean detalBean = new Gson().fromJson(json, DetalBean.class);//因為圖片的連接在一起,所以要截斷 // String[] images = detalBean.getData().getImages().split("\\|"); list = new ArrayList<>();for (int i = 0; i < detalBean.getData().size(); i++) { // list.add(images[i]); if (detalBean.getData().get(i).getIcon() != null) {// 圖片添加到集合 list.add(detalBean.getData().get(i).getIcon());}}runOnUiThread(new Runnable() {@Override public void run() {//設置顯示輪播 banner.setImageUrls(list);//設置點擊事件 banner.setClickListner(new CustomBanner.OnClickLisner() {@Override public void onItemClick(int position) {if (detalBean.getData().get(position).getType() == 0) {//跳轉到詳情頁面 Intent intent = new Intent(MainActivity.this, DetailsActivity.class);intent.putExtra("url", detalBean.getData().get(position).getUrl());startActivity(intent);} else {Toast.makeText(MainActivity.this, "點擊" + position, Toast.LENGTH_SHORT).show();}}});}});}}});} }
自定義View//DetailsActivity
public class DetailsActivity extends AppCompatActivity {private WebView webView;@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_details);webView = (WebView) findViewById(R.id.webView);Intent intent = getIntent();//接收傳過來的值 String url = intent.getStringExtra("url");//加載 webView.loadUrl(url);//加載網址到視圖 //設置 webView.setWebViewClient(new WebViewClient());WebSettings settings = webView.getSettings();settings.setJavaScriptEnabled(true);settings.setJavaScriptCanOpenWindowsAutomatically(true);} }
//CustomBanner
public class CustomBanner extends FrameLayout {private ViewPager viewPager;private LinearLayout linearLayout;private List<String> list;int time = 2;//消息接受 Handler hander = new Handler() {@Override public void handleMessage(Message msg) {super.handleMessage(msg);if (msg.what == 0) {int currentItem = viewPager.getCurrentItem();viewPager.setCurrentItem(currentItem + 1);//再次發送 sendEmptyMessageDelayed(0, time * 1000);}}};private ArrayList<ImageView> listDoc;private OnClickLisner onClickLisner;//創建類時,自動創建了三個構造方法,當調用本類時,都會走構造方法里的方法,也就是初始化 public CustomBanner(@NonNull Context context) {super(context);init();}public CustomBanner(@NonNull Context context, @Nullable AttributeSet attrs) {super(context, attrs);init();}public CustomBanner(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}//初始化方法 private void init() {//找到banner布局 View view = View.inflate(getContext(), R.layout.banner_layout, this);//找到控件 viewPager = view.findViewById(R.id.banner_view_pager);linearLayout = view.findViewById(R.id.linear_bannner);}/** * 對外提供設置image路徑的方法 * 當我調用這個方法的時候,給它傳一個集合,集合中裝的是要展示的圖片 */ public void setImageUrls(List<String> list) {this.list = list;//當集合為空的時候,不至于報錯 if (list == null) {return;}//設置適配器 當我獲取到數據的時候,我要讓它首先能展示圖片,然后在做手動滑動,最后實現無線自動輪播 LunBoAdapter lunBoAdapter = new LunBoAdapter(getContext(), list);viewPager.setAdapter(lunBoAdapter);//加載小圓點 initDoc();//顯示中間某個位置 就是初始化的時候,可以讓他來回翻動 viewPager.setCurrentItem(list.size() * 10000);//使用handler自動輪播 hander.sendEmptyMessageDelayed(0, time * 1000);viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {@Override /* * 當用手指滑動翻頁的時候,如果翻動成功了(滑動的距離夠長), * 手指抬起來就會立即執行這個方法,position就是當前滑動到的頁面。如果直接setCurrentItem翻頁,那position就和setCurrentItem的參數一致, * 這種情況在onPageScrolled執行方法前就會立即執行 * */ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {//在選中某一頁的時候,切換小圓點的背景 for (int i = 0; i < listDoc.size(); i++) {if (position % listDoc.size() == i) {listDoc.get(i).setBackgroundResource(R.drawable.shape_01);} else {listDoc.get(i).setBackgroundResource(R.drawable.shape_02);}}}@Override public void onPageSelected(int position) {}@Override public void onPageScrollStateChanged(int state) {}});}/** * 點擊事件 * @param onClickLisner */ public void setClickListner(OnClickLisner onClickLisner) {this.onClickLisner = onClickLisner;}private class LunBoAdapter extends PagerAdapter {private List<String> list;private Context context;public LunBoAdapter(Context context, List<String> list) {this.context = context;this.list = list;}//我要重寫兩個方法,才能實現功能 @Override public int getCount() {return Integer.MAX_VALUE;}@Override public boolean isViewFromObject(View view, Object object) {return view == object;}//加載 當頁面滑動時,預加載左右兩個圖片 @Override public Object instantiateItem(ViewGroup container, final int position) {//創建imageView ImageView imageView = new ImageView(getContext());//鋪滿橫屏 imageView.setScaleType(ImageView.ScaleType.FIT_XY);//加載這張圖片 Glide.with(getContext()).load(list.get(position % list.size())).into(imageView);//點擊事件 imageView.setOnClickListener(new OnClickListener() {@Override public void onClick(View view) {//觸發 onClickLisner.onItemClick(position%list.size());}});//添加到容器 container.addView(imageView);//返回 return imageView;}//銷毀 @Override public void destroyItem(ViewGroup container, int position, Object object) {container.removeView((View) object);}}private void initDoc() {//創建一個集合,記錄這些小圓點 listDoc = new ArrayList<ImageView>();//清空布局 // linearLayout.removeAllViews(); for (int i = 0; i < list.size(); i++) {//創建一個圖片的占位 ImageView docImage = new ImageView(getContext());if (i == 0) {//默認小圓點第一個顯示帶顏色 docImage.setBackgroundResource(R.drawable.shape_01);} else {//其他變成平常的 顏色 docImage.setBackgroundResource(R.drawable.shape_02);}//添加到集合 設置完小圓點添加到集合 可能是每次設置完之后都添加再展示 listDoc.add(docImage);//添加到線性布局 //第一個參數為寬的設置,第二個參數為高的設置。 //(用的時候注意修改LinearLayout前綴,其實很多時候可以不寫它的) LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);//設置 設置MarginS margin與padding 設置邊距的 params.setMargins(5, 0, 5, 0);//整個小圓點的父布局添加布局圖片的控件 第二個參數是設置位置 linearLayout.addView(docImage, params);}}//內部接口 public interface OnClickLisner{void onItemClick(int position);} }
util文件夾下//OkHttp3Util
public class OkHttp3Util {private static OkHttpClient okHttpClient = null;private OkHttp3Util() {}public static OkHttpClient getInstance() {if (okHttpClient == null) {//加同步安全 synchronized (OkHttp3Util.class) {if (okHttpClient == null) {//okhttp可以緩存數據....指定緩存路徑 File sdcache = new File(Environment.getExternalStorageDirectory(), "cache");//指定緩存大小 int cacheSize = 10 * 1024 * 1024;okHttpClient = new OkHttpClient.Builder()//構建器 .connectTimeout(15, TimeUnit.SECONDS)//連接超時 .writeTimeout(20, TimeUnit.SECONDS)//寫入超時 .readTimeout(20, TimeUnit.SECONDS)//讀取超時 .cache(new Cache(sdcache.getAbsoluteFile(), cacheSize))//設置緩存 .build();}}}return okHttpClient;}/** * get請求 * 參數1 url * 參數2 回調Callback */ public static void doGet(String oldUrl, Callback callback) {//創建OkHttpClient請求對象 OkHttpClient okHttpClient = getInstance();//創建Request Request request = new Request.Builder().url(oldUrl).build();//得到Call對象 Call call = okHttpClient.newCall(request);//執行異步請求 call.enqueue(callback);}/** * post請求 * 參數1 url * 參數2 Map<String, String> params post請求的時候給服務器傳的數據 * add..("","") * add() */ public static void doPost(String url, Map<String, String> params, Callback callback) {//創建OkHttpClient請求對象 OkHttpClient okHttpClient = getInstance();//3.x版本post請求換成FormBody 封裝鍵值對參數 FormBody.Builder builder = new FormBody.Builder();//遍歷集合,,,map集合遍歷方式 for (String key : params.keySet()) {builder.add(key, params.get(key));}//創建Request....formBody...new formBody.Builder()...add()....build() Request request = new Request.Builder().url(url).post(builder.build()).build();Call call = okHttpClient.newCall(request);call.enqueue(callback);}/** * post請求上傳文件....包括圖片....流的形式傳任意文件... * 參數1 url * file表示上傳的文件 * fileName....文件的名字,,例如aaa.jpg * params ....傳遞除了file文件 其他的參數放到map集合 */ public static void uploadFile(String url, File file, String fileName,Map<String,String> params,Callback callback) {//創建OkHttpClient請求對象 OkHttpClient okHttpClient = getInstance();//MultipartBody多功能的請求實體對象,,,formBody只能傳表單形式的數據 MultipartBody.Builder builder = new MultipartBody.Builder();builder.setType(MultipartBody.FORM);//參數 if (params != null){for (String key : params.keySet()){builder.addFormDataPart(key,params.get(key));}}//文件...參數name指的是請求路徑中所接受的參數...如果路徑接收參數鍵值是fileeeee,此處應該改變 builder.addFormDataPart("file",fileName,RequestBody.create(MediaType.parse("application/octet-stream"),file));//構建 MultipartBody multipartBody = builder.build();//創建Request Request request = new Request.Builder().url(url).post(multipartBody).build();//得到Call Call call = okHttpClient.newCall(request);//執行請求 call.enqueue(callback);}/** * Post請求發送JSON數據....{"name":"zhangsan","pwd":"123456"} * 參數一:請求Url * 參數二:請求的JSON * 參數三:請求回調 */ public static void doPostJson(String url, String jsonParams, Callback callback) {RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonParams);Request request = new Request.Builder().url(url).post(requestBody).build();Call call = getInstance().newCall(request);call.enqueue(callback);}/** * 下載文件 以流的形式把apk寫入的指定文件 得到file后進行安裝 * 參數er:請求Url * 參數san:保存文件的文件夾....download */ public static void download(final Activity context, final String url, final String saveDir) {Request request = new Request.Builder().url(url).build();Call call = getInstance().newCall(request);call.enqueue(new Callback() {@Override public void onFailure(Call call, IOException e) {//com.orhanobut.logger.Logger.e(e.getLocalizedMessage()); }@Override public void onResponse(Call call, final Response response) throws IOException {InputStream is = null;byte[] buf = new byte[2048];int len = 0;FileOutputStream fos = null;try {is = response.body().byteStream();//以字節流的形式拿回響應實體內容 //apk保存路徑 final String fileDir = isExistDir(saveDir);//文件 File file = new File(fileDir, getNameFromUrl(url));fos = new FileOutputStream(file);while ((len = is.read(buf)) != -1) {fos.write(buf, 0, len);}fos.flush();context.runOnUiThread(new Runnable() {@Override public void run() {Toast.makeText(context, "下載成功:" + fileDir + "," + getNameFromUrl(url), Toast.LENGTH_SHORT).show();}});//apk下載完成后 調用系統的安裝方法 Intent intent = new Intent(Intent.ACTION_VIEW);intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");context.startActivity(intent);} catch (IOException e) {e.printStackTrace();} finally {if (is != null) is.close();if (fos != null) fos.close();}}});}/** * 判斷下載目錄是否存在......并返回絕對路徑 * * @param saveDir * @return * @throws IOException */ public static String isExistDir(String saveDir) throws IOException {// 下載位置 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {File downloadFile = new File(Environment.getExternalStorageDirectory(), saveDir);if (!downloadFile.mkdirs()) {downloadFile.createNewFile();}String savePath = downloadFile.getAbsolutePath();Log.e("savePath", savePath);return savePath;}return null;}/** * @param url * @return 從下載連接中解析出文件名 */ private static String getNameFromUrl(String url) {return url.substring(url.lastIndexOf("/") + 1);} }
//添加的依賴
compile 'com.google.code.gson:gson:2.8.2' compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' compile 'com.android.support.test:runner:0.5' compile 'com.android.support.test.espresso:espresso-core:2.2.2' compile 'com.squareup.okhttp3:okhttp:3.6.0' compile 'com.squareup.okio:okio:1.11.0' compile files('libs/glide-3.7.0.jar')
//添加的權限
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
總結
以上是生活随笔為你收集整理的自定义Banner轮播图片的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 白帽子渗透测试入门资源:参考书、课程、工
- 下一篇: CleanMyMac X试用版与正式版区