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

来源:互联网 发布:cocos2d x js安装教程 编辑:程序博客网 时间:2024/06/04 17:40

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

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
原创粉丝点击