日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

自定义Banner轮播图片

發(fā)布時(shí)間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自定义Banner轮播图片 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

//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);//需求 實(shí)現(xiàn)與banner一樣的輪播圖 banner = (CustomBanner) findViewById(R.id.custom_banner);//請(qǐng)求數(shù)據(jù)進(jìn)行解析展示 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);//因?yàn)閳D片的連接在一起,所以要截?cái)?// 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() {//設(shè)置顯示輪播 banner.setImageUrls(list);//設(shè)置點(diǎn)擊事件 banner.setClickListner(new CustomBanner.OnClickLisner() {@Override public void onItemClick(int position) {if (detalBean.getData().get(position).getType() == 0) {//跳轉(zhuǎn)到詳情頁(yè)面 Intent intent = new Intent(MainActivity.this, DetailsActivity.class);intent.putExtra("url", detalBean.getData().get(position).getUrl());startActivity(intent);} else {Toast.makeText(MainActivity.this, "點(diǎn)擊" + 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();//接收傳過(guò)來(lái)的值 String url = intent.getStringExtra("url");//加載 webView.loadUrl(url);//加載網(wǎng)址到視圖 //設(shè)置 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);//再次發(fā)送 sendEmptyMessageDelayed(0, time * 1000);}}};private ArrayList<ImageView> listDoc;private OnClickLisner onClickLisner;//創(chuàng)建類時(shí),自動(dòng)創(chuàng)建了三個(gè)構(gòu)造方法,當(dāng)調(diào)用本類時(shí),都會(huì)走構(gòu)造方法里的方法,也就是初始化 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);}/** * 對(duì)外提供設(shè)置image路徑的方法 * 當(dāng)我調(diào)用這個(gè)方法的時(shí)候,給它傳一個(gè)集合,集合中裝的是要展示的圖片 */ public void setImageUrls(List<String> list) {this.list = list;//當(dāng)集合為空的時(shí)候,不至于報(bào)錯(cuò) if (list == null) {return;}//設(shè)置適配器 當(dāng)我獲取到數(shù)據(jù)的時(shí)候,我要讓它首先能展示圖片,然后在做手動(dòng)滑動(dòng),最后實(shí)現(xiàn)無(wú)線自動(dòng)輪播 LunBoAdapter lunBoAdapter = new LunBoAdapter(getContext(), list);viewPager.setAdapter(lunBoAdapter);//加載小圓點(diǎn) initDoc();//顯示中間某個(gè)位置 就是初始化的時(shí)候,可以讓他來(lái)回翻動(dòng) viewPager.setCurrentItem(list.size() * 10000);//使用handler自動(dòng)輪播 hander.sendEmptyMessageDelayed(0, time * 1000);viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {@Override /* * 當(dāng)用手指滑動(dòng)翻頁(yè)的時(shí)候,如果翻動(dòng)成功了(滑動(dòng)的距離夠長(zhǎng)), * 手指抬起來(lái)就會(huì)立即執(zhí)行這個(gè)方法,position就是當(dāng)前滑動(dòng)到的頁(yè)面。如果直接setCurrentItem翻頁(yè),那position就和setCurrentItem的參數(shù)一致, * 這種情況在onPageScrolled執(zhí)行方法前就會(huì)立即執(zhí)行 * */ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {//在選中某一頁(yè)的時(shí)候,切換小圓點(diǎn)的背景 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) {}});}/** * 點(diǎn)擊事件 * @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;}//我要重寫兩個(gè)方法,才能實(shí)現(xiàn)功能 @Override public int getCount() {return Integer.MAX_VALUE;}@Override public boolean isViewFromObject(View view, Object object) {return view == object;}//加載 當(dāng)頁(yè)面滑動(dòng)時(shí),預(yù)加載左右兩個(gè)圖片 @Override public Object instantiateItem(ViewGroup container, final int position) {//創(chuàng)建imageView ImageView imageView = new ImageView(getContext());//鋪滿橫屏 imageView.setScaleType(ImageView.ScaleType.FIT_XY);//加載這張圖片 Glide.with(getContext()).load(list.get(position % list.size())).into(imageView);//點(diǎn)擊事件 imageView.setOnClickListener(new OnClickListener() {@Override public void onClick(View view) {//觸發(fā) 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() {//創(chuàng)建一個(gè)集合,記錄這些小圓點(diǎn) listDoc = new ArrayList<ImageView>();//清空布局 // linearLayout.removeAllViews(); for (int i = 0; i < list.size(); i++) {//創(chuàng)建一個(gè)圖片的占位 ImageView docImage = new ImageView(getContext());if (i == 0) {//默認(rèn)小圓點(diǎn)第一個(gè)顯示帶顏色 docImage.setBackgroundResource(R.drawable.shape_01);} else {//其他變成平常的 顏色 docImage.setBackgroundResource(R.drawable.shape_02);}//添加到集合 設(shè)置完小圓點(diǎn)添加到集合 可能是每次設(shè)置完之后都添加再展示 listDoc.add(docImage);//添加到線性布局 //第一個(gè)參數(shù)為寬的設(shè)置,第二個(gè)參數(shù)為高的設(shè)置。 //(用的時(shí)候注意修改LinearLayout前綴,其實(shí)很多時(shí)候可以不寫它的) LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);//設(shè)置 設(shè)置MarginS marginpadding 設(shè)置邊距的 params.setMargins(5, 0, 5, 0);//整個(gè)小圓點(diǎn)的父布局添加布局圖片的控件 第二個(gè)參數(shù)是設(shè)置位置 linearLayout.addView(docImage, params);}}//內(nèi)部接口 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可以緩存數(shù)據(jù)....指定緩存路徑 File sdcache = new File(Environment.getExternalStorageDirectory(), "cache");//指定緩存大小 int cacheSize = 10 * 1024 * 1024;okHttpClient = new OkHttpClient.Builder()//構(gòu)建器 .connectTimeout(15, TimeUnit.SECONDS)//連接超時(shí) .writeTimeout(20, TimeUnit.SECONDS)//寫入超時(shí) .readTimeout(20, TimeUnit.SECONDS)//讀取超時(shí) .cache(new Cache(sdcache.getAbsoluteFile(), cacheSize))//設(shè)置緩存 .build();}}}return okHttpClient;}/** * get請(qǐng)求 * 參數(shù)1 url * 參數(shù)2 回調(diào)Callback */ public static void doGet(String oldUrl, Callback callback) {//創(chuàng)建OkHttpClient請(qǐng)求對(duì)象 OkHttpClient okHttpClient = getInstance();//創(chuàng)建Request Request request = new Request.Builder().url(oldUrl).build();//得到Call對(duì)象 Call call = okHttpClient.newCall(request);//執(zhí)行異步請(qǐng)求 call.enqueue(callback);}/** * post請(qǐng)求 * 參數(shù)1 url * 參數(shù)2 Map<String, String> params post請(qǐng)求的時(shí)候給服務(wù)器傳的數(shù)據(jù) * add..("","") * add() */ public static void doPost(String url, Map<String, String> params, Callback callback) {//創(chuàng)建OkHttpClient請(qǐng)求對(duì)象 OkHttpClient okHttpClient = getInstance();//3.x版本post請(qǐng)求換成FormBody 封裝鍵值對(duì)參數(shù) FormBody.Builder builder = new FormBody.Builder();//遍歷集合,,,map集合遍歷方式 for (String key : params.keySet()) {builder.add(key, params.get(key));}//創(chuàng)建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請(qǐng)求上傳文件....包括圖片....流的形式傳任意文件... * 參數(shù)1 url * file表示上傳的文件 * fileName....文件的名字,,例如aaa.jpg * params ....傳遞除了file文件 其他的參數(shù)放到map集合 */ public static void uploadFile(String url, File file, String fileName,Map<String,String> params,Callback callback) {//創(chuàng)建OkHttpClient請(qǐng)求對(duì)象 OkHttpClient okHttpClient = getInstance();//MultipartBody多功能的請(qǐng)求實(shí)體對(duì)象,,,formBody只能傳表單形式的數(shù)據(jù) MultipartBody.Builder builder = new MultipartBody.Builder();builder.setType(MultipartBody.FORM);//參數(shù) if (params != null){for (String key : params.keySet()){builder.addFormDataPart(key,params.get(key));}}//文件...參數(shù)name指的是請(qǐng)求路徑中所接受的參數(shù)...如果路徑接收參數(shù)鍵值是fileeeee,此處應(yīng)該改變 builder.addFormDataPart("file",fileName,RequestBody.create(MediaType.parse("application/octet-stream"),file));//構(gòu)建 MultipartBody multipartBody = builder.build();//創(chuàng)建Request Request request = new Request.Builder().url(url).post(multipartBody).build();//得到Call Call call = okHttpClient.newCall(request);//執(zhí)行請(qǐng)求 call.enqueue(callback);}/** * Post請(qǐng)求發(fā)送JSON數(shù)據(jù)....{"name":"zhangsan","pwd":"123456"} * 參數(shù)一:請(qǐng)求Url * 參數(shù)二:請(qǐng)求的JSON * 參數(shù)三:請(qǐng)求回調(diào) */ 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后進(jìn)行安裝 * 參數(shù)er:請(qǐng)求Url * 參數(shù)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();//以字節(jié)流的形式拿回響應(yīng)實(shí)體內(nèi)容 //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下載完成后 調(diào)用系統(tǒng)的安裝方法 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();}}});}/** * 判斷下載目錄是否存在......并返回絕對(duì)路徑 * * @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')


//添加的權(quán)限

<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"/>


總結(jié)

以上是生活随笔為你收集整理的自定义Banner轮播图片的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。