自定义控件实现文本滚动

来源:互联网 发布:手机配货软件 编辑:程序博客网 时间:2024/06/04 18:22

1.textView放在ViewFlipper中实现滑动效果(可设置左右、或者上下滚动),很明显这应该是自定义view;

2.利用textView的点击事件即可实现点击;

这给布局文件就是调用我们自定义的控件
下面是自定义控件的代码

import android.content.Context;import android.graphics.Color;import android.os.Handler;import android.os.Message;import android.util.AttributeSet;import android.view.Gravity;import android.view.View;import android.view.animation.AccelerateInterpolator;import android.view.animation.Animation;import android.view.animation.TranslateAnimation;import android.widget.TextSwitcher;import android.widget.TextView;import android.widget.ViewSwitcher;import java.util.ArrayList;/** * Created by Love_you on 2017/9/18 0018. */public class MarqueeTextView extends TextSwitcher implements ViewSwitcher.ViewFactory {    private static final int FLAG_START_AUTO_SCROLL = 0;    private static final int FLAG_STOP_AUTO_SCROLL = 1;    private float mTextSize = 16 ;    private int mPadding = 5;    private int textColor = Color.BLACK;    /**     * @param textSize 字号     * @param padding 内边距     * @param textColor 字体颜色     */    public void setText(float textSize,int padding,int textColor) {        mTextSize = textSize;        mPadding = padding;        this.textColor = textColor;    }    private OnItemClickListener itemClickListener;    private Context mContext;    private int currentId = -1;    private ArrayList<String> textList;    private Handler handler;    public MarqueeTextView(Context context) {        this(context, null);        mContext = context;    }    public MarqueeTextView(Context context, AttributeSet attrs) {        super(context, attrs);        mContext = context;        textList = new ArrayList<String>();    }    public void setAnimTime(long animDuration) {        setFactory(this);        Animation in = new TranslateAnimation(0, 0, animDuration, 0);        in.setDuration(animDuration);        in.setInterpolator(new AccelerateInterpolator());        Animation out = new TranslateAnimation(0, 0, 0, -animDuration);        out.setDuration(animDuration);        out.setInterpolator(new AccelerateInterpolator());        setInAnimation(in);        setOutAnimation(out);    }    /**     * 间隔时间     * @param time     */    public void setTextStillTime(final long time){        handler =new Handler() {            @Override            public void handleMessage(Message msg) {                switch (msg.what) {                    case FLAG_START_AUTO_SCROLL:                        if (textList.size() > 0) {                            currentId++;                            setText(textList.get(currentId % textList.size()));                        }                        handler.sendEmptyMessageDelayed(FLAG_START_AUTO_SCROLL,time);                        break;                    case FLAG_STOP_AUTO_SCROLL:                        handler.removeMessages(FLAG_START_AUTO_SCROLL);                        break;                }            }        };    }    /**     * 设置数据源     * @param titles     */    public void setTextList(ArrayList<String> titles) {        textList.clear();        textList.addAll(titles);        currentId = -1;    }    /**     * 开始滚动     */    public void startAutoScroll() {        handler.sendEmptyMessage(FLAG_START_AUTO_SCROLL);    }    /**     * 停止滚动     */    public void stopAutoScroll() {        handler.sendEmptyMessage(FLAG_STOP_AUTO_SCROLL);    }    @Override    public View makeView() {        TextView t = new TextView(mContext);        t.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);        t.setMaxLines(1);        t.setPadding(mPadding, mPadding, mPadding, mPadding);        t.setTextColor(textColor);        t.setTextSize(mTextSize);        t.setClickable(true);        t.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                if (itemClickListener != null && textList.size() > 0 && currentId != -1) {                    itemClickListener.onItemClick(currentId % textList.size());                }            }        });        return t;    }    /**     * 设置点击事件监听     * @param itemClickListener     */    public void setOnItemClickListener(OnItemClickListener itemClickListener) {        this.itemClickListener = itemClickListener;    }    /**     * 轮播文本点击监听器     */    public interface OnItemClickListener {        /**         * 点击回调         * @param position 当前点击ID         */        void onItemClick(int position);    }}

在Activity调用这个方法控件

private void init() {        mTextview = (MarqueeTextView) findViewById(R.id.MarqueeTextView);        titleList=new ArrayList<>();        titleList.add("公告1");        titleList.add("公告2");        titleList.add("公告3");        titleList.add("公告4");        titleList.add("公告5");        titleList.add("公告6");        titleList.add("公告7");        titleList.add("公告8");        mTextview.setTextList((ArrayList<String>) titleList);        mTextview.setText(14, 5, Color.RED);//设置属性        mTextview.setTextStillTime(3000);//设置停留时长间隔        mTextview.setAnimTime(300);//设置进入和退出的时间间隔        mTextview.setOnItemClickListener(new MarqueeTextView.OnItemClickListener() {            @Override            public void onItemClick(int position) {                Toast.makeText(MainActivity.this, "点击了 : " + titleList.get(position), Toast.LENGTH_SHORT).show();            }        });    }    @Override    protected void onResume() {        super.onResume();        mTextview.startAutoScroll();    }    @Override    protected void onPause() {        super.onPause();        mTextview.stopAutoScroll();    }

下面是一个文本横向滚动这个布局文件就是一个TextView

public class MainActivity extends AppCompatActivity {    private TextView tv;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        tv = (TextView)this.findViewById(R.id.textview);        String str = "我将应鲁哈尼总统邀请对伊朗进行国事访问,就新形势下深化中伊关系及重大国际和地区问题深入交换意见,共同推动中伊关系迈上新台阶。";        CharSequence charstr = Html.fromHtml(str);        tv.setText(charstr);        tv.setMovementMethod(LinkMovementMethod.getInstance());    }}
原创粉丝点击