您的位置:首页 > 其它

自定义控件实现banner轮播

2017-12-03 21:07 274 查看
一、添加依赖
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
compile 'com.google.code.gson:gson:2.8.2'
compile 'com.squareup.okhttp3:okhttp:3.6.0'
compile 'com.squareup.okio:okio:1.11.0'
二、布局main
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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:orientation="vertical"
android:layout_height="match_parent" tools:context="com.example.week1_moni.MainActivity">
android:id="@+id/custom_bannner"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

</LinearLayout>
banner布局
<?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.ViewPagerandroid:id="@+id/view_pager"android:layout_width="match_parent"android:layout_height="200dp"></android.support.v4.view.ViewPager><LinearLayoutandroid:id="@+id/linear_layout"android:orientation="horizontal"android:layout_centerHorizontal="true"android:layout_alignBottom="@+id/view_pager"android:layout_marginBottom="10dp"android:layout_width="wrap_content"android:layout_height="wrap_content"></LinearLayout></RelativeLayout>
三、自定义banner类
package com.example.week1_moni;import android.content.Context;import android.graphics.Bitmap;import android.os.Handler;import android.os.Message;import android.support.annotation.NonNull;import android.support.annotation.Nullable;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.FrameLayout;import android.widget.ImageView;import android.widget.LinearLayout;import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;import com.nostra13.universalimageloader.cache.disc.naming.HashCodeFileNameGenerator;import com.nostra13.universalimageloader.cache.memory.impl.LruMemoryCache;import com.nostra13.universalimageloader.core.DisplayImageOptions;import com.nostra13.universalimageloader.core.ImageLoader;import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;import com.nostra13.universalimageloader.core.assist.ImageScaleType;import com.nostra13.universalimageloader.core.assist.QueueProcessingType;import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer;import com.nostra13.universalimageloader.core.download.BaseImageDownloader;import com.nostra13.universalimageloader.utils.StorageUtils;import java.io.File;import java.util.ArrayList;import java.util.List;/*** Created by DESKTOP on 2017/12/2.*/public class CustomBanner extends FrameLayout {private ViewPager viewPager;private LinearLayout linearLayout;private List<String> list;private int time = 2;private Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {if (msg.what == 0){//viewPager显示下一页viewPager.setCurrentItem(viewPager.getCurrentItem() +1);//再次发送延时消息handler.sendEmptyMessageDelayed(0,time*1000);}}};private ArrayList<ImageView> images;private OnBannerClickListner bannerClickListner;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();}/*** 对外提供设置时间*/public void setTimeSeconds(int time){this.time = time;}/*** 初始化的方法,,,加载布局*/private void init() {//初始化imageLoaderImageLoaderUtil.init(getContext());View view = View.inflate(getContext(), R.layout.custom_banner_layout, this);//找到控件viewPager = view.findViewById(R.id.view_pager);linearLayout = view.findViewById(R.id.linear_layout);}/*** 对外提供设置数据的方法*/public void setImageUrl(List<String> list){this.list = list;if (list == null){return;}//设置适配器MyAdapter myAdapter = new MyAdapter(getContext(), list);//设置适配器viewPager.setAdapter(myAdapter);initDoc(list);//2.手动的可以无限滑动viewPager.setCurrentItem(list.size()*100000);//设置当前展示中间某个足够大的位置handler.sendEmptyMessageDelayed(0,time*1000);//发送一个延时的空消息//viewPage设置监听事件viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}/*** 当选中某个页面的时候,把当前的小圆点背景变成绿色* @param position*/@Overridepublic void onPageSelected(int position) {for (int i=0;i<images.size();i++){if (i == position%images.size()){images.get(i).setImageResource(R.drawable.shape_01);}else {images.get(i).setImageResource(R.drawable.shape_02);}}}@Overridepublic void onPageScrollStateChanged(int state) {}});}/*** 动态添加小圆点* @param list*/private void initDoc(List<String> list) {//1.需要一个集合记录一下小圆点的imageView控件images = new ArrayList<ImageView>();//2...linearLayout上面的视图清空一下再去添加linearLayout.removeAllViews();for (int i=0;i<list.size();i++){ImageView imageView = new ImageView(getContext());if (i==0){imageView.setImageResource(R.drawable.shape_01);}else {imageView.setImageResource(R.drawable.shape_02);}//添加到集合去images.add(imageView);//添加到线性布局上//这是布局参数,,刚开始小圆点之间没有距离,所以使用java代码指定宽度高度,并且指定小圆点之间的距离LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);params.setMargins(5,0,5,0);linearLayout.addView(imageView,params);}}private class MyAdapter extends PagerAdapter {Context context;List<String> list;public MyAdapter(Context context, List<String> list) {this.context = context;this.list = list;}@Overridepublic int getCount() {return Integer.MAX_VALUE;}@Overridepublic boolean isViewFromObject(View view, Object object) {return view == object;}/*** viewPager具有预加载,默认的前后加载一页,,,默认的容器里面最多三页* @param container* @param position* @return*/@Overridepublic Object instantiateItem(ViewGroup container, final int position) {//1.把这个当前展示的视图添加到容器中...containerImageView imageView = new ImageView(context);//..........使图片平铺整个imageView控件imageView.setScaleType(ImageView.ScaleType.FIT_XY);//imageLoader加载图片到这个imageView控件上ImageLoader.getInstance().displayImage(list.get(position %list.size()),imageView,ImageLoaderUtil.getDefaultOption());//给imageView设置触摸的监听事件imageView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent motionEvent) {int action = motionEvent.getAction();//获取手指的动作switch (action){case MotionEvent.ACTION_DOWN://按下的动作...应该取消发送消息的操作handler.removeCallbacksAndMessages(null);break;case MotionEvent.ACTION_MOVE://移动的动作handler.removeCallbacksAndMessages(null);break;case MotionEvent.ACTION_CANCEL://取消//重新发送handler.sendEmptyMessageDelayed(0,time*1000);break;case MotionEvent.ACTION_UP://抬起的动作handler.sendEmptyMessageDelayed(0,time*1000);break;}return false;}});imageView.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View view) {bannerClickListner.onBannerClick(position%list.size());}});container.addView(imageView);//添加到容器//2.把当前展示的视图返回return imageView;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {//销毁视图container.removeView((View) object);}}private static class ImageLoaderUtil {/*** 初始化** @param context*/public static void init(Context context) {File cacheDir = StorageUtils.getCacheDirectory(context);  //缓存文件夹路径ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context).threadPoolSize(3) // default  线程池内加载的数量.threadPriority(Thread.NORM_PRIORITY - 2) // default 设置当前线程的优先级.tasksProcessingOrder(QueueProcessingType.FIFO) // default.denyCacheImageMultipleSizesInMemory().memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //可以通过自己的内存缓存实现.memoryCacheSize(2 * 1024 * 1024)  // 内存缓存的最大值.memoryCacheSizePercentage(13) // default.diskCache(new UnlimitedDiskCache(cacheDir)) // default 可以自定义缓存路径.diskCacheSize(50 * 1024 * 1024) // 50 Mb sd卡(本地)缓存的最大值.diskCacheFileCount(100)  // 可以缓存的文件数量// default为使用HASHCODE对UIL进行加密命名, 还可以用MD5(new Md5FileNameGenerator())加密.diskCacheFileNameGenerator(new HashCodeFileNameGenerator()).imageDownloader(new BaseImageDownloader(context)) // default.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default.writeDebugLogs() // 打印debug log.build(); //开始构建//关键初始化的代码ImageLoader.getInstance().init(config);}public static DisplayImageOptions getDefaultOption() {DisplayImageOptions options = new DisplayImageOptions.Builder().showImageOnLoading(R.mipmap.ic_launcher) // 设置图片下载期间显示的图片.showImageForEmptyUri(R.mipmap.ic_launcher) // 设置图片Uri为空或是错误的时候显示的图片.showImageOnFail(R.mipmap.ic_launcher) // 设置图片加载或解码过程中发生错误显示的图片.resetViewBeforeLoading(true)  // default 设置图片在加载前是否重置、复位.cacheInMemory(true) // default  设置下载的图片是否缓存在内存中.cacheOnDisk(true) // default  设置下载的图片是否缓存在SD卡中.considerExifParams(true) // default.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default 设置图片以如何的编码方式显示.bitmapConfig(Bitmap.Config.ARGB_8888) // default 设置图片的解码类型.displayer(new SimpleBitmapDisplayer()) // default  还可以设置圆角图片new RoundedBitmapDisplayer(20).build();return options;}}public void setOnBannerClickListner(OnBannerClickListner bannerClickListner){this.bannerClickListner = bannerClickListner;}/*** 点击的接口*/public interface OnBannerClickListner {public void onBannerClick(int position);}}
四、MAinActivity类
package com.example.week1_moni;import android.Manifest;import android.annotation.TargetApi;import android.content.Intent;import android.content.pm.PackageManager;import android.os.Bundle;import android.support.v4.app.ActivityCompat;import android.support.v4.content.ContextCompat;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.widget.Toast;import com.google.gson.Gson;import java.io.IOException;import java.util.ArrayList;import java.util.List;import okhttp3.Call;import okhttp3.Callback;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.Response;public class MainActivity extends AppCompatActivity {private int time = 100;private CustomBanner customBanner;private List<String> list;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);customBanner = (CustomBanner) findViewById(R.id.custom_bannner);customBanner.setTimeSeconds(3);if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {//B.不允许...的时候,,,请求用户允许这个权限// Activity arg0代表当前的activity, @NonNull String[] arg1请求的权限的数组,也就是需要请求允许哪些权限, int arg2请求码ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1001);}else {getDataFromNet();}}private void getDataFromNet() {//http://120.27.23.105/ad/getAd//1.创建一个okhttp客户端对象OkHttpClient okHttpClient = new OkHttpClient();//2.通过请求的构建器来创建一个请求对象,并指定请求的url地址Request request = new Request.Builder().url("http://120.27.23.105/ad/getAd").build();//3.客户端调用请求okhttp3.Call call = okHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {e.printStackTrace();}@Overridepublic void onResponse(Call call, final Response response) throws IOException {if (response.isSuccessful()){final String string = response.body().string();//耗时,子线程获取runOnUiThread(new Runnable() {//主线程@Overridepublic void run() {Log.i("---+++",string);BannerBean bannerBean = new Gson().fromJson(string, BannerBean.class);final List<BannerBean.DataBean> data = bannerBean.getData();list = new ArrayList<>();for (int i = 0;i<data.size();i++){list.add(data.get(i).getIcon());}customBanner.setImageUrl(list);//设置点击事件customBanner.setOnBannerClickListner(new CustomBanner.OnBannerClickListner() {@Overridepublic void onBannerClick(int position) {//Toast.makeText(MainActivity.this,"点击了",Toast.LENGTH_SHORT).show();//判断BannerBean.DataBean dataBean = data.get(position);if (dataBean.getType() == 0){//跳转到详情Intent intent = new Intent(MainActivity.this,SecondActivity.class);intent.putExtra("url",dataBean.getUrl());startActivity(intent);}else if (dataBean.getType() == 1){Toast.makeText(MainActivity.this,"我要跳转到商品详情页",Toast.LENGTH_SHORT).show();}}});}});}}});}/*** C.请求权限的结果....可以获取到用户是否允许了权限*/@TargetApi(23)@Overridepublic void onRequestPermissionsResult(int requestCode,String[] permissions, int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == 1001) {//grantResults用户允许权限的返回值....数组里面放的是用户是否允许权限//PackageManager.PERMISSION_GRANTED允许权限if (grantResults.length>0 && grantResults[0]== PackageManager.PERMISSION_GRANTED) {getDataFromNet();}else {Toast.makeText(MainActivity.this, "拒绝", Toast.LENGTH_SHORT).show();}}}}
五、shape圆点
shape—1:
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="#00ff00"/><corners android:radius="10dp"/><size android:height="10dp" android:width="10dp"/></shape>
shape-2:
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="#ff0000"/><corners android:radius="10dp"/><size android:height="10dp" android:width="10dp"/></shape>
---------------------------------------------------------------------------------------------------------------
点击图片跳转第二个页面
一、Main2Activity布局
<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout 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.example.week1_moni.SecondActivity"><WebViewandroid:id="@+id/web_view"android:layout_width="match_parent"android:layout_height="match_parent"></WebView></android.support.constraint.ConstraintLayout>
二、代码:
package com.example.week1_moni;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.webkit.WebSettings;import android.webkit.WebView;import android.webkit.WebViewClient;public class SecondActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);String url = getIntent().getStringExtra("url");WebView webView = (WebView) findViewById(R.id.web_view);webView.loadUrl(url);webView.setWebViewClient(new WebViewClient());WebSettings settings = webView.getSettings();settings.setJavaScriptCanOpenWindowsAutomatically(true);settings.setJavaScriptEnabled(true);}}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: