自定义view实现无线轮播

来源:互联网 发布:许晴 王雪冰 知乎 编辑:程序博客网 时间:2024/06/05 22:58
public class MainActivity extends AppCompatActivity{

    private AutoBanner banner;
    private int screenWidth;
    private int screenHeight;
    List<String> list=new ArrayList<>();
    List<String> urllist=new ArrayList<>();
    List<Integer> type=new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        banner = (AutoBanner) findViewById(R.id.ab);
        //创建客户端对象
        OkHttpClient client=new OkHttpClient();
        //创建请求对象
        Request build= new Request.Builder()
                .url("http://120.27.23.105/ad/getAd")
                .build();
        //客户端调用请求对象,执行
        client.newCall(build).enqueue(new Callback() {
            @Override
            public void onFailure(okhttp3.Call call, IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(okhttp3.Call call, Response response) throws IOException {
                if(response.isSuccessful()){
                    String string= null;
                    try {
                        string = response.body().string();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    final String finalString = string;
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Gson  gson=new Gson();
                            DataDataBean dataDataBean= gson.fromJson(finalString, DataDataBean.class);
                            List<DataDataBean.DataBean> data= dataDataBean.getData();
                            for (DataDataBean.DataBean d :data){
                                list.add(d.getIcon());
                                type.add(d.getType());
                                urllist.add(d.getUrl());

                            }
                            banner.setPath(list);
                            //设置点击事件
                            banner.setOnClickListener(new Listner() {
                                @Override
                                public void onItemClick(int position) {
                                    Integer integer= type.get(position);
                                    if(integer==0){
                                        Intent intent=new Intent(MainActivity.this,Main2Activity.class);
                                        intent.putExtra("url",urllist.get(position));
                                        startActivity(intent);
                                    }else if(integer==1){
                                        Toast.makeText(MainActivity.this,"我要跳转到商品详情页面",Toast.LENGTH_LONG).show();
                                    }
                                }
                            });

                        }

                    });


                }
            }
        });


    }


}

//自定义view

public class AutoBanner extends FrameLayout {
    private ViewPager vp;
    private LunAdp adp;
    private List<String> path;
    private List<ImageView> pointlist = new ArrayList<>();
    private View view;
    private LinearLayout lin;
    private int size;
    private int jianju;
    private Listner listner;

    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 0) {
                vp.setCurrentItem(vp.getCurrentItem() + 1, true);//显示下一条
            }
            handler.sendEmptyMessageDelayed(0, 2000);//发送延时消息
        }
    };
    public AutoBanner(@NonNull Context context) {
        super(context);
        init();
    }

    public AutoBanner(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        size = attrs.getAttributeIntValue("http://schemas.android.com/apk/res-auto", "size", 6);
        jianju = attrs.getAttributeIntValue("http://schemas.android.com/apk/res-auto", "jianju", 6);
        init();
    }

    public AutoBanner(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        view = View.inflate(getContext(), R.layout.lunbo_layout, this);
        vp = (ViewPager) view.findViewById(R.id.vp);
        lin = (LinearLayout) view.findViewById(R.id.lin);
    }
    //设置图片
    @SuppressLint("ClickableViewAccessibility")
    public void setPath(List<String> path) {
        this.path = path;
        vp.setAdapter(new LunAdp());//设置适配器
        vp.setCurrentItem(path.size() * 100000);//设置当前显示页面
        handler.sendEmptyMessageDelayed(0, 2000);//发送延时消息,无限轮播
        initpoint();//画出图片变化时的小点点
        //设置页面改变事件
        vp.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }
            //选中页面时遍历集合,设置当前页面小点点颜色与其他的不同
            @Override
            public void onPageSelected(int position) {
                for (int i = 0; i < pointlist.size(); i++) {
                    if (i == position % pointlist.size()) {
                        pointlist.get(i).setImageResource(R.drawable.shap);
                    } else {
                        pointlist.get(i).setImageResource(R.drawable.shap1);
                    }
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });


    }

    public void initpoint() {
        lin.removeAllViews();
        for (int i = 0; i < path.size(); i++) {
            ImageView image = new ImageView(getContext());
            if (i == 0) {
                image.setImageResource(R.drawable.shap);
            } else {
                image.setImageResource(R.drawable.shap1);
            }
            //添加到集合
            pointlist.add(image);
            //设置原点边距
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(size, size);
            params.setMargins(jianju, 0, jianju, 0);
            lin.addView(image, params);
        }

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    }

    public void setJianJu(int jianju) {
        this.jianju = jianju;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public void setOnClickListener(Listner listner) {
        this.listner = listner;
    }
    //内部适配器
    class LunAdp extends PagerAdapter {

        @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());
            //给控件设置图片
            ImageLoader.getInstance().displayImage(path.get(position % path.size()), imageView, ImageLoaderUtil.getdefaultoption());
            container.addView(imageView);//将控件加载视图中
            //给viewpager设置触摸事件
            imageView.setOnTouchListener(new OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    switch (motionEvent.getAction()) {
                        case MotionEvent.ACTION_MOVE:
                            handler.removeCallbacksAndMessages(null);//鼠标移动时取消发送延迟消息
                            break;
                        case MotionEvent.ACTION_CANCEL:
                            handler.sendEmptyMessageDelayed(1, 2000);
                            break;
                        case MotionEvent.ACTION_UP:
                            handler.sendEmptyMessageDelayed(1, 2000);
                            break;
                        case MotionEvent.ACTION_DOWN:
                            handler.removeCallbacksAndMessages(null);//鼠标按下时取消发送延迟消息
                            listner.onItemClick(position%path.size());//调用接口,设置点击事件,
                            break;
                    }
                    return true;//自己处理事件

                }
            });
            return imageView;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }
    }

}



//自定义接口

public interface Listner {
    void onItemClick(int position);
}

原创粉丝点击