自定义banner,兼容大部分情况。

这是一个可以无限滚动的顶部公告。

Java代码RollAdvertise.jave:

package com.example.jun.testmybanner.fragment;

import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Interpolator;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Scroller;

import com.example.jun.testmybanner.R;
import com.facebook.drawee.view.SimpleDraweeView;

import java.lang.reflect.Field;
import java.util.Timer;
import java.util.TimerTask;

public class RollAdvertise extends Fragment implements ViewPager.OnPageChangeListener {
    private View mLayoutView;
    private ViewPager viewPager;
    private ViewGroup group;

    private String[] urlArray;    //所有的图片资源的URL
    private SimpleDraweeView[] sdvArray;  //装所有图片的
    private ImageView[] tipsArray;  //装点点的ImageView数组
    private String[] webViewUrlArray;   //点击item后进入的webview
    private int arrNum = 0;
    private int focusedId = 0;
    private int unfocusedId = 0;
    private int animationTime = 500;       //动画的时间
    private int intervalTime = 2000;        //动画时间与间隔的时间一起的时间
    private Handler handler = null;
    private Timer timer = null;
    private TimerTask task = null;
    private Field field = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        mLayoutView = inflater.inflate(R.layout.fragment_roll_advertise, container, false);
        initData();
        return mLayoutView;
    }

    @Override
    public void onPause() {
        super.onPause();
    }

    public void setAllUrl(String[] urlArray, String[] webViewUrlArray, int focused, int unfocused) {
        this.urlArray = urlArray;
        arrNum = this.urlArray.length;

        if (webViewUrlArray != null && webViewUrlArray.length != 0) {
            if (webViewUrlArray.length == 1) {
                this.webViewUrlArray = new String[4];
                this.webViewUrlArray[0] = webViewUrlArray[0];
                this.webViewUrlArray[1] = webViewUrlArray[0];
                this.webViewUrlArray[2] = webViewUrlArray[0];
                this.webViewUrlArray[3] = webViewUrlArray[0];
            } else if (webViewUrlArray.length == 2) {
                this.webViewUrlArray = new String[4];
                this.webViewUrlArray[0] = webViewUrlArray[0];
                this.webViewUrlArray[1] = webViewUrlArray[1];
                this.webViewUrlArray[2] = webViewUrlArray[0];
                this.webViewUrlArray[3] = webViewUrlArray[1];
            } else {
                this.webViewUrlArray = webViewUrlArray;
            }
        }

        focusedId = focused;
        unfocusedId = unfocused;

        initRoll();
        startTimer();       //启动动画
    }

    public void initRoll() {
        if (urlArray.length == 0 || focusedId == 0 | unfocusedId == 0) {
            return;
        }

        //将点点加入到ViewGroup中
        tipsArray = new ImageView[arrNum];
        for (int i = 0; i < tipsArray.length; i++) {
            ImageView imageView = new ImageView(getActivity());
            imageView.setLayoutParams(new ViewGroup.LayoutParams(10, 10));
            tipsArray[i] = imageView;
            if (i == 0) {
                tipsArray[i].setBackgroundResource(focusedId);
            } else {
                tipsArray[i].setBackgroundResource(unfocusedId);
            }

            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT));
            layoutParams.leftMargin = 5;
            layoutParams.rightMargin = 5;
            group.addView(imageView, layoutParams);
        }

        //将图片装载到数组中
        if (arrNum == 1) {
            sdvArray = new SimpleDraweeView[4];
            for (int i = 0; i < sdvArray.length; i++) {
                SimpleDraweeView sdv = new SimpleDraweeView(getActivity());
                sdvArray[i] = sdv;
                sdv.setImageURI(Uri.parse(urlArray[0]));
            }
        } else if (arrNum == 2) {
            sdvArray = new SimpleDraweeView[4];
            for (int i = 0; i < sdvArray.length; i++) {
                SimpleDraweeView sdv = new SimpleDraweeView(getActivity());
                sdvArray[i] = sdv;
                sdv.setImageURI(Uri.parse(urlArray[i % 2]));
            }
        } else {
            sdvArray = new SimpleDraweeView[arrNum];
            for (int i = 0; i < sdvArray.length; i++) {
                SimpleDraweeView sdv = new SimpleDraweeView(getActivity());
                sdvArray[i] = sdv;
                sdv.setImageURI(Uri.parse(urlArray[i]));
            }
        }

        for (int i = 0; i < sdvArray.length; i++) {
            sdvArray[i].setId(i);
            sdvArray[i].setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.d("kk", v.getId() + "");
                }
            });
        }

        //设置Adapter
        viewPager.setAdapter(new MyAdapter());
        //设置监听,主要是设置点点的背景
        viewPager.setOnPageChangeListener(this);
        //设置ViewPager的默认项, 设置为长度的100倍,这样子开始就能往左滑动
        viewPager.setCurrentItem((sdvArray.length) * 100);

        try {
            field = ViewPager.class.getDeclaredField("mScroller");
            field.setAccessible(true);
            FixedSpeedScroller scroller = new FixedSpeedScroller(viewPager.getContext(),
                    new AccelerateInterpolator());
            field.set(viewPager, scroller);
            scroller.setmDuration(animationTime);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void initData() {
        group = (ViewGroup) mLayoutView.findViewById(R.id.viewGroup);
        viewPager = (ViewPager) mLayoutView.findViewById(R.id.viewPager);

        handler = new Handler() {
            public void handleMessage(Message msg) {
                if (msg.what == 1) {
                    try {
                        viewPager.setCurrentItem((viewPager.getCurrentItem() + 1), true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                super.handleMessage(msg);
            }
        };

        viewPager.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                    case MotionEvent.ACTION_MOVE:
                        stopTimer();        //暂停动画
                        break;
                    case MotionEvent.ACTION_CANCEL:
                    case MotionEvent.ACTION_UP:
                        startTimer();       //启动动画
                        break;
                }
                return false;
            }
        });
    }

    public class MyAdapter extends PagerAdapter {
        @Override
        public int getCount() {
            return Integer.MAX_VALUE;
        }

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            return arg0 == arg1;
        }

        @Override
        public void destroyItem(View container, int position, Object object) {
            ((ViewPager) container).removeView(sdvArray[position % sdvArray.length]);
        }

        /**
         * 载入图片进去,用当前的position 除以 图片数组长度取余数是关键
         */
        @Override
        public Object instantiateItem(View container, int position) {
            try {
                ((ViewPager) container).addView(sdvArray[position % sdvArray.length], 0);
            } catch (Exception e) {
                e.printStackTrace();
            }

            return sdvArray[position % sdvArray.length];
        }
    }


    @Override
    public void onPageScrollStateChanged(int arg0) {

    }

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {

    }

    @Override
    public void onPageSelected(int arg0) {
        setImageBackground(arg0 % arrNum);
    }

    /**
     * 设置选中的tip的背景
     *
     * @param selectItems
     */
    private void setImageBackground(int selectItems) {
        for (int i = 0; i < tipsArray.length; i++) {
            if (i == selectItems) {
                tipsArray[i].setBackgroundResource(focusedId);
            } else {
                tipsArray[i].setBackgroundResource(unfocusedId);
            }
        }
    }

    public class FixedSpeedScroller extends Scroller {
        private int mDuration = 1500;

        public FixedSpeedScroller(Context context) {
            super(context);
        }

        public FixedSpeedScroller(Context context, Interpolator interpolator) {
            super(context, interpolator);
        }

        @Override
        public void startScroll(int startX, int startY, int dx, int dy, int duration) {
            // Ignore received duration, use fixed one instead
            super.startScroll(startX, startY, dx, dy, mDuration);
        }

        @Override
        public void startScroll(int startX, int startY, int dx, int dy) {
            // Ignore received duration, use fixed one instead
            super.startScroll(startX, startY, dx, dy, mDuration);
        }

        public void setmDuration(int time) {
            mDuration = time;
        }

        public int getmDuration() {
            return mDuration;
        }
    }

    public void stopTimer() {
        if (timer != null) {
            timer.cancel();
            timer = null;
        }
        if (task != null) {
            task.cancel();
            task = null;
        }
    }

    public void startTimer() {
        if (timer == null) {
            timer = new Timer();
        }

        if (task == null) {
            task = new TimerTask() {
                @Override
                public void run() {
                    // 需要做的事:发送消息
                    Message message = new Message();
                    message.what = 1;
                    handler.sendMessage(message);
                }
            };
        }

        if (timer != null && task != null)
            timer.schedule(task, intervalTime, intervalTime); // 0s后执行task,经过intervalTime秒再次执行
    }
}


这是一个fragment,大家可以直接放到自己的工程中。

代码中的SimpleDraweeView是一个Facebook提供的一个加载图片的控件,大家也可以直接使用ImageView。


使用代码MainActivity.java

package com.example.jun.testmybanner;

import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;

import com.example.jun.testmybanner.fragment.RollAdvertise;
import com.facebook.drawee.view.SimpleDraweeView;

public class MainActivity extends AppCompatActivity {

    private SimpleDraweeView sdvTest;

    private RollAdvertise fRoll;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sdvTest = (SimpleDraweeView) findViewById(R.id.sdvTest);

        sdvTest.setImageURI(Uri.parse("http://scimg.jb51.net/allimg/160317/14-16031G13220936.jpg"));

        FragmentManager fragmentManager = this.getSupportFragmentManager();
        fRoll = (RollAdvertise) fragmentManager.findFragmentById(R.id.fRoll);

        String allUrl[] = new String[]{
                "http://img3.imgtn.bdimg.com/it/u=2546610023,3120506294&fm=11&gp=0.jpg",
                "http://pic32.nipic.com/20130814/13162234_111708002000_2.jpg",
                "http://pic54.nipic.com/file/20141204/19902974_135858226000_2.jpg",
                "http://img03.tooopen.com/images/20131102/sy_45238929299.jpg",
        };
        fRoll.setAllUrl(allUrl, null, R.drawable.page_indicator_focused, R.drawable.page_indicator_unfocused);
    }
}


其中这个
sdvTest = (SimpleDraweeView) findViewById(R.id.sdvTest);
sdvTest.setImageURI(Uri.parse("http://scimg.jb51.net/allimg/160317/14-16031G13220936.jpg"));
是介绍怎么使用SimpleDraweeView的,下面是怎么使用该fragment的。


fragment的fragment_roll_advertise.xml代码为:

<pre name="code" class="html"><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.jun.testmybanner.fragment.RollAdvertise">

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <LinearLayout
            android:id="@+id/viewGroup"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_marginBottom="30dp"
            android:gravity="center_horizontal"
            android:orientation="horizontal"></LinearLayout>
    </RelativeLayout>
</FrameLayout>

 

activity_main.xml文件:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.jun.testmybanner.fragment.RollAdvertise">

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <LinearLayout
            android:id="@+id/viewGroup"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_marginBottom="30dp"
            android:gravity="center_horizontal"
            android:orientation="horizontal"></LinearLayout>
    </RelativeLayout>
</FrameLayout>





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值