Android开发 跑马灯效果的制作
- 格式:ppt
- 大小:332.00 KB
- 文档页数:15
AndroidTextView 实现跑马灯效果的⽅法本⽂为⼤家分享⼀个⾮常简单但⼜很常⽤的控件,跑马灯状态的TextView 。
当要显⽰的⽂本长度太长,⼜不想换⾏时⽤它来显⽰⽂本,⼀来可以完全的显⽰出⽂本,⼆来效果也挺酷,实现起来超级简单,所以,何乐不为。
先看下效果图:代码实现TextView ⾃带了跑马灯功能,只要把它的ellipsize 属性设置为marquee 就可以了。
但有个前提,就是TextView 要处于被选中状态才能有效果,看到这,我们就很⾃然的⾃定义⼀个控件,写出以下代码:12345678910111213141516171819202122public class MarqueeTextView extends TextView { public MarqueeTextView(Context con) { super(con);}public MarqueeTextView(Context context, AttributeSet attrs) {super(context, attrs);} public MarqueeTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); }@Overridepublic boolean isFocused() {// TODO Auto-generated method stubif(getEditableText().equals(TruncateAt.MARQUEE)){ return true; } return super.isFocused(); }}重写了isFocused ⽅法,并进⾏判断,只有设置了marqueen 属性的才保持选中状态,否则它就跟普通TextView ⼀样。
接下来就可以直接使⽤了,看下布局:1234567<LinearLayout xmlns:android="/apk/res/android "xmlns:tools="/tools "android:layout_width="match_parent"891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253android:layout_height="match_parent"android:orientation="vertical"><FrameLayout android:id="@+id/titlebar_layout" android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#39ac69" ><LinearLayoutandroid:layout_width="match_parent" android:layout_height="50dp" android:background="#ffffff" android:gravity="center_vertical"android:orientation="horizontal" ><ImageViewandroid:id="@+id/home_location_iv" android:layout_width="25dp" android:layout_height="27dp" android:layout_marginLeft="10dp"android:scaleType="fitXY"android:src="@drawable/icon_place" /><com.lxj.marqueetextview.MarqueeTextViewandroid:id="@+id/home_location_tv" android:layout_width="0dp" android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:layout_weight="1" android:ellipsize="marquee" android:focusable="true"android:focusableInTouchMode="true"android:gravity="center"android:marqueeRepeatLimit="marquee_forever" android:scrollHorizontally="true" android:singleLine="true" android:text="正在定位..."android:textColor="#39ac69"android:textSize="18sp" /><ImageView android:id="@+id/home_search_iv" android:layout_width="25dp" android:layout_height="27dp"android:layout_marginRight="10dp"android:scaleType="fitXY"android:src="@drawable/icon_place" /> </LinearLayout></FrameLayout></LinearLayout>要注意两点ellipsize 属性要设置为”marquee”,⾏数属性即singleLine 要设置为true 。
跑马灯制作原理跑马灯(也称滚动字幕)是一种广告效果很好的Web元素。
制作跑马灯需要用到一些基础的HTML、CSS、和JavaScript知识。
下面我们将从制作原理、制作步骤和实现代码三个方面来介绍跑马灯的制作过程。
制作原理跑马灯是通过JavaScript脚本实现网页元素的动态滚动来实现的。
具体来说,我们可以通过以下步骤来实现跑马灯效果:1. 在HTML中创建一个具有足够宽度的容器。
2. 我们将需要滚动的内容放入容器中,并将其设置为一个很大的块。
3. 使用JavaScript脚本来实现间断性地将内容块从容器的左侧向右移动,然后重复这个过程,以实现跑马灯效果。
制作步骤1. 首先,我们需要在HTML中创建一个容器,该容器将用于容纳需要滚动的内容。
我们可以使用以下代码来创建一个具有50%宽度和100px 高度的容器。
<div id="container" style="width:50%;height:100px;"></div>2. 接下来,我们将需要用到一些CSS来设置容器的基本样式。
我们可以使用以下CSS代码来设置容器的背景颜色、边框和控制文字的样式:#container {background-color: #000000;border: 2px solid #ffffff;overflow: hidden;}3. 我们也需要向容器中添加滚动内容的HTML代码。
在这个示例中,我们将使用一些简单的文本作为滚动内容。
我们可以使用以下HTML代码来添加这些内容:<div id="content" style="position: relative; width: 200%;">这是滚动内容,这是滚动内容,这是滚动内容,这是滚动内容,这是滚动内容,这是滚动内容,这是滚动内容,这是滚动内容,这是滚动内容,这是滚动内容,这是滚动内容,这是滚动内容,这是滚动内容,这是滚动内容,这是滚动内容,这是滚动内容,这是滚动内容,这是滚动内容,这是滚动内容,这是滚动内容,这是滚动内容,这是滚动内容,这是滚动内容。
Android跑马灯效果实现的三种方式1、使用系统默认的跑马灯效果实现方法:(1)在xml文件加入一个TextView,并设置属性如下,其中红色的部分是最关键部分<TextViewandroid:id="@+id/textView_showmsg_circle"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:textColor="#ff0000"android:singleLine="true"android:ellipsize="marquee"android:marqueeRepeatLimit="marquee_forever"android:background="#ffffff"android:textSize="20dp"android:focusable="true"android:focusableInTouchMode="true"android:scrollHorizontally="true"/>(2)通过设置xml中的属性,该TextView已经具备了跑马灯的效果。
但是,此种情况下,只有当TextView获取到焦点时,才能出现跑马灯效果,一旦丢失焦点,跑马灯效果不再,控件从开始显示一定宽度的字符。
其效果如下图例所示。
主程序代码:final TextViewtvCircle = (TextView)findViewById(R.id.textView_showmsg_circle);tvCircle.setText("2.2.1. 紧急通知类消息紧急通知类型的消息主要指恶劣天气警报或政府部门授权下发的紧急事件通知。
android中实现跑马灯效果以及AutoCompleteTestView与MultiAu。
跑马灯效果1.⽤过属性的⽅式实现跑马灯效果属性:android:singleLine="true" 这个属性是设置TextView⽂本中⽂字以省略号的形式收缩⽂本内容android:focusable="true":启动跑马效果<TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:singleLine="true"android:ellipsize="marquee"android:focusable="true"android:focusableInTouchMode="true"android:text="这是跑马灯实现,我是跑马灯,我要跑起来了,跑起来了跑呀跑呀" />那我们定义多个TextView实现跑马灯看看有什么效果?我们可以在activity_main.xml中加多⼀个TextView控件,可以看到如下显⽰很显然当我们定义多个TextView时候第⼆个TextView着跑不起来了,所以这很显然不能满⾜我们的需求这时我们可以⾃定义的⽅式来实现,这样就灵活的操作TextView了这样就可以看上去⽅便许多2.⾃定义跑马灯实现步骤:1.定义⼀个普通类⽤于继承TextView控件对象2.重写相应的构造⽅法和isFocused()⽅法public class MyTextView extends TextView {public MyTextView(Context context) {super(context);}public MyTextView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}public MyTextView(Context context, AttributeSet attrs) {super(context, attrs);}@Override@ExportedProperty(category = "focus")public boolean isFocused() {//将其返回值设置为truereturn true ;}} 3.引⽤我们⾃定义的控件<com.example.runmudeng.MyTextViewandroid:id="@+id/text_view"android:layout_width="match_parent"android:layout_height="wrap_content"android:singleLine="true"android:ellipsize="marquee"android:focusable="true"android:focusableInTouchMode="true"android:text="这是跑马灯实现,我是跑马灯,我要跑起来了,跑起来了跑呀跑呀" /> <com.example.runmudeng.MyTextViewandroid:layout_below="@+id/text_view"android:layout_width="match_parent"android:layout_height="wrap_content"android:singleLine="true"android:ellipsize="marquee"android:focusable="true"android:focusableInTouchMode="true"android:text="这是跑马灯实现,我是跑马灯,我要跑起来了,跑起来了跑呀跑呀" /> 4.检查结果搜索提⽰快速查找AutoCompleteTextView控件在很多apk中都运⽤了这个功能操作,就像百度上当你输⼊⼀个android单词着会显⽰下拉提⽰供你选择点击,那如何实现下⾯图⽚的显⽰的那个功能呢?我们着需要运⽤⼀个AutoCompleteTextView控件进⾏实现这个功能操作1.添加控件功能:可以动态的匹配输⼊的内容,可以根据显⽰匹配热门信息属性: android:completionThreshold="3" :这个属性是设置当你输⼊到3个字符的时候将列出提⽰内容<AutoCompleteTextViewandroid:completionThreshold="3"android:id="@+id/autoCompleteTextView1"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输⼊你要查询的内容"></AutoCompleteTextView> 2.实现操作1)⾸先我们初始化控件 2)定义⼀个适配器对象3)初始化数据源 4)将适配器赋值到控件中public class MainActivity extends Activity {//初始化⼀个AutoCompleteTextView对象private AutoCompleteTextView act;//初始化数据源private String[] data = {"android","onClick","android2","Struts","Spring",};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);/*** 1实例化控件对象* 2需要定义⼀个适配器对象* 3初始化数据源* 4.将适配器赋值到控件对象中*/act = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView1);ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,yout.simple_expandable_list_item_1,data);act.setAdapter(adapter);}} MultiAutoCompleteTextView控件功能:和上⾯的AutoCompleteTextView功能是⼀样的,只是该控件的功能更强⼤,它⽀持多选择操作属性: android:completionThreshold="3" :这个属性是设置当你输⼊到3个字符的时候将列出提⽰内容1该控件⽀持多条件选择所以它要设置我们要选择时定义⼀个分割符,⽽这分割符是内部提供的⽅法进⾏操作这次同样的在该Android⼯程下的activity_main.xml中添加另外的⼀个控件MultiAutoCompleteTextView通过这个控件可以实现多搜索选择操作<MultiAutoCompleteTextViewandroid:completionThreshold="3"android:id="@+id/multiAutoCompleteTextView1"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/autoCompleteTextView1"android:hint="请选择多个你要查询的内容" ></MultiAutoCompleteTextView>2.实现同样操作,在MainActivity.java中获取该控件的对象,然后操作步骤如上1)⾸先我们初始化控件 2)定义⼀个适配器对象3)初始化数据源 4)将适配器赋值到控件中 5)设置分割符public class MainActivity extends Activity {//初始化⼀个AutoCompleteTextView对象private AutoCompleteTextView act;//初始化数据源private String[] data = {"android","onClick","android2","Struts","Spring",};//初始化⼀个MultiAutoCompleteTextView对象private MultiAutoCompleteTextView mact ;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);/*** 1实例化控件对象* 2需要定义⼀个适配器对象* 3初始化数据源* 4.将适配器赋值到控件对象中*/act = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView1);ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,yout.simple_expandable_list_item_1,data);act.setAdapter(adapter);/*** 1实例化控件对象* 2需要定义⼀个适配器对象* 3初始化数据源* 4.将适配器赋值到控件对象中* 5设置分隔符*/mact = (MultiAutoCompleteTextView) findViewById(R.id.multiAutoCompleteTextView1);ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this,yout.simple_expandable_list_item_1,data);mact.setAdapter(adapter2);mact.setTokenizer(new maTokenizer());}}ToggleButton控件1.什么是ToggleButton:可以通过toggle这个单词就指定,就像开关操作,当你点击⼀下则开,点击⼀下着关状态:分为选中状态和未选中状态 ,并且为不同的状态设置不同的显⽰⽂本内容属性:android:checked=" " textOff="" textOn=""check属性:默认是falsetextOff,textOn:是设置你开关值1.⾸先我们在布局⽂件中添加⼀个控件ToggleButton<ToggleButtonandroid:id="@+id/toggleButton1"android:layout_width="match_parent"android:layout_height="wrap_content"android:textOn="开"android:textOff="关"/>2.编写代码获取你点击的状态public class MainActivity extends Activity {//声明⼀个ToggleButton对象private ToggleButton togglebt ;private ImageView imgView ;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);togglebt = (ToggleButton) findViewById(R.id.toggleButton1);imgView = (ImageView) findViewById(R.id.img);//给toggleButton绑定⼀个事件togglebt.setOnCheckedChangeListener(new OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {//获取当前点击时是否为trueif(isChecked){imgView.setBackgroundResource(R.drawable.on);}else{imgView.setBackgroundResource(R.drawable.off);}}});}}CheckBox复选框<CheckBoxandroid:checked="true"android:id="@+id/checkBox1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="CheckBox" />RadioGroup和RadioButton 实现底部选择栏<RadioGroupandroid:id="@+id/radioGroup1"android:layout_width="wrap_content"android:layout_height="wrap_content" ><RadioButtonandroid:id="@+id/radio0"android:layout_width="wrap_content"android:layout_height="wrap_content"android:checked="true"android:text="RadioButton" /><RadioButtonandroid:id="@+id/radio1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="RadioButton" /></RadioGroup>说起RadioGroup在实际的开发中运⽤⾮常⼴,在很多的apk中都基本上运⽤了该组件实现了底部选栏的效果接下来⼩编带⼤家实现微信底部选栏1.我们定义⼀个布局⽂件为activity_footer.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal" ><RadioGroupandroid:id="@+id/radioGroup1"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:paddingTop="5dp"android:paddingBottom="5dp"android:background="@drawable/group_buton_nomal"><RadioButtonandroid:drawableTop="@drawable/_mainframe"android:id="@+id/radio0"android:checked="true"android:text="@string/_weixi_text"style="@style/radio_group"android:textColor="@drawable/_mainframe"/><RadioButtonandroid:drawableTop="@drawable/content"android:id="@+id/radio1"android:text="@string/_str_address"style="@style/radio_group"android:textColor="@drawable/content"/><RadioButtonandroid:drawableTop="@drawable/_discover"android:id="@+id/radio2"android:text="@string/_str_find"style="@style/radio_group"android:textColor="@drawable/_discover" /><RadioButtonandroid:drawableTop="@drawable/_me"android:id="@+id/radio3"android:text="@string/_str_me"style="@style/radio_group"android:textColor="@drawable/_me"/></RadioGroup></LinearLayout>我们可以通过RadioGroup组件中的⼀个属性android:orientation="horizontal"设置该组件中的内容为⽔平排列然后我将⼀些公共的样式抽取到⼀个style.xml中<style name="radio_group"><item name="android:layout_width">wrap_content</item><item name="android:layout_height">wrap_content</item><item name="android:layout_weight">1</item><item name="android:button">@null</item><item name="android:gravity">center</item><item name="android:textSize">10dp</item></style>如何将⼀个按钮变化为⼀个图⽚呢?很简单可以通过 android:button="@null"/>这时你可以看到如下的布局了是不是很快呢??2. 这时我们要设置当你点击的时候可以切换图⽚和字体颜⾊,我们需要定义⼀个xml来帮我实现该效果1)我们在drawable⽬录下分别为这四个案例设置xml⽂件xxx.xml内容<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="/apk/res/android" ><!-- 点击的时候改变图⽚,并且字体设置颜⾊ --><item android:state_checked="true" android:drawable="@drawable/tabbar_discoverhl" android:color="@color/green"/><item android:drawable="@drawable/tabbar_discover" android:color="@color/grey"/></selector>当你点击时为true将设置有颜⾊的图⽚和将字体改为绿⾊,当你编写完这4个⽂件之后,这时候你要分别在每个radioButton中引⽤这四个⽂件如:<RadioButtonandroid:drawableTop="@drawable/_me"//图⽚引⽤android:id="@+id/radio3"android:text="@string/_str_me"style="@style/radio_group"android:textColor="@drawable/_me"//字体引⽤/>恭喜你操作完成。
Android 纵向跑马灯滚动效果像淘宝和京东都会有跑马灯的效果,今天给大家贡献下以前项目的一个demo。
我们先定义一个Bean文件,这个实体类文件主要包含标题,内容描述,以及还有跳转的链接。
LampBean[html] view plain copy print?在CODE上查看代码片派生到我的代码片public class LampBean implements Serializable {public String title;public String info;}接下来我们要去自定义一个LampView了,Lamp主要实现数据的接受,适配器填充数据,以及滚动实现,这里可以看出适配器模式在我们Android开发模式中用处的广泛,为了方便后面的数据的适配我们将数据源用泛型。
[html] view plain copy print?在CODE上查看代码片派生到我的代码片public abstract class BaseAutoScrollTextView<T> extends ListView implementsAutoScrollData<T> {private ArrayList<T> mDataList = new ArrayList<T>();private float mSize=16;private int mMax;private int position = -1;private int scroll_Y;private int mScrollY;private AutoScrollAdapter mAutoScrollAdapter = new AutoScrollAdapter();private OnItemClickListener mOnItemClickListener;private long mTimer = 1000;private Context mContext;protected abstract int getAdertisementHeight();private Handler handler = new Handler();Runnable runnable = new Runnable() {@Overridepublic void run() {// 开启轮播switchItem();handler.postDelayed(this, mTimer);}};public interface OnItemClickListener {public void onItemClick(int position);}public BaseAutoScrollTextView(Context context, AttributeSet attrs,int defStyle) {super(context, attrs, defStyle);this.mContext = context;mScrollY = dip2px(getAdertisementHeight());init();}public BaseAutoScrollTextView(Context context, AttributeSet attrs) { this(context, attrs, 0);}public BaseAutoScrollTextView(Context context) {this(context, null);}private void init() {this.setDivider(null);this.setFastScrollEnabled(false);this.setDividerHeight(0);this.setEnabled(false);}private int dip2px(float dipValue) {final float scale = mContext.getResources().getDisplayMetrics().density;return (int) (dipValue * scale + 0.5f);}private void switchItem() {if (position == -1) {scroll_Y = 0;} else {scroll_Y = mScrollY;}smoothScrollBy(scroll_Y, 2000);setSelection(position);position++;}private class AutoScrollAdapter extends BaseAdapter {@Overridepublic int getCount() {final int count = mDataList == null ? 0 : mDataList.size();return count > 1 ? Integer.MAX_VALUE : count;}@Overridepublic Object getItem(int position) {return mDataList.get(position % mMax);}@Overridepublic long getItemId(int position) {return position % mMax;}@Overridepublic View getView(final int position, View convertView,ViewGroup parent) {ViewHolder viewHolder;if (null == convertView) {viewHolder = new ViewHolder();convertView = LayoutInflater.from(mContext).inflate(yout.item_lamp_layout, null);viewHolder.mTitleView = (TextView) convertView.findViewById(_title);viewHolder.mInfoView = (TextView) convertView.findViewById(_info);convertView.setTag(viewHolder);} else {viewHolder = (ViewHolder) convertView.getTag();}T data = mDataList.get(position % mMax);initItemData(position, convertView, viewHolder, data);return convertView;}}private void initItemData(final int position, View convertView, ViewHolder viewHolder, T data) { viewHolder.mTitleView.setLayoutParams(new youtParams(youtParams.WRAP_CONTENT,dip2px(getAdertisementHeight())));viewHolder.mTitleView.setTextSize(mSize);viewHolder.mInfoView.setTextSize(mSize);viewHolder.mTitleView.setText(getTextTitle(data));viewHolder.mInfoView.setText(getTextInfo(data));convertView.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {mOnItemClickListener.onItemClick(position % mMax);}});}static class ViewHolder {TextView mTitleView;// 标题TextView mInfoView;// 内容}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) { return false;}public void setData(ArrayList<T> _datas) {mDataList.clear();mDataList.addAll(_datas);mMax = mDataList == null ? 0 : mDataList.size();this.setAdapter(mAutoScrollAdapter);mAutoScrollAdapter.notifyDataSetChanged();}public void setTextSize(float _size){this.mSize=_size;}public void setOnItemClickListener(OnItemClickListener _listener) { this.mOnItemClickListener = _listener;}public void setTimer(long _time) {this.mTimer = _time;}public void start() {handler.postDelayed(runnable, 1000);}public void stop() {handler.removeCallbacks(runnable);}然后添加一个实现的类:[html] view plain copy print?在CODE上查看代码片派生到我的代码片public class VerticalLampView extendsBaseAutoScrollTextView<LampBean> {public VerticalLampView(Context context, AttributeSet attrs,int defStyle) {super(context, attrs, defStyle);}public VerticalLampView(Context context, AttributeSet attrs) { super(context, attrs);}public VerticalLampView(Context context) {super(context);}@Overridepublic String getTextTitle(LampBean data) {return data.title;}@Overridepublic String getTextInfo(LampBean data) {return ;}/*** 这里面的高度应该和你的xml里设置的高度一致*/@Overrideprotected int getAdertisementHeight() {return 40;}}最后是测试代码:[html] view plain copy print?在CODE上查看代码片派生到我的代码片public class LampView nds FrameLayout {@Bind(mp_view)VerticalLampView lampView;private Context mContext = null;private List<LampBean> list=new ArrayList<>();public LampView(Context context, AttributeSet attrs) {super(context, attrs);this.mContext = context;init();}private void init() {setView();}private void setView() {inflate(getContext(), mp_layout, this);ButterKnife.bind(this, this);initData();initView();}private void initView() {lampView.setData((ArrayList<LampBean>) list);lampView.setTextSize(15);lampView.setTimer(2000);lampView.start();}private void initData() {LampBean bean = new LampBean();bean.title = "爆款"; = "踏青零食上京东,百万零食1元秒";list.add(bean);bean = new LampBean();bean.title = "公告"; = "看老刘中国行,满129减50!";list.add(bean);bean = new LampBean();bean.title = "活动"; = "高姿CC霜全渠道新品首发,领券199减50,点击查看";list.add(bean); }。
TextView实现文字滚动需要以下几个要点:1.文字长度长于可显示范围:android:singleLine="true"2.设置可滚到,或显示样式:android:ellipsize="marquee"3.TextView只有在获取焦点后才会滚动显示隐藏文字,因此需要在包中新建一个类,继承TextView。
重写isFocused方法,这个方法默认行为是,如果TextView获得焦点,方法返回true,失去焦点则返回false。
跑马灯效果估计也是用这个方法判断是否获得焦点,所以把它的返回值始终设置为true。
以下转自他人:Java语言: AlwaysMarqueeTextView 类public class AlwaysMarqueeTextView extends TextView{public AlwaysMarqueeTextView(Contextcontext) {super(context);}public AlwaysMarqueeTextView(Contextcontext,AttributeSetattrs) {super(context,attrs);}public AlwaysMarqueeTextView(Contextcontext,AttributeSetattrs,int defStyle) {super(context,attrs,defStyle);}@Overridepublic boolean isFocused() {return true;}在布局XML文件中加入这么一个AlwaysMarqueeTextView,这个加入方法也是刚刚学的。
XML语言: layout.xml<com.examples.AlwaysMarqueeTextViewandroid:id=―@+id/AMTV1″android:layout_width=―fill_parent‖android:layout_height=―wrap_content‖android:lines=―1″android:focusable=―true‖android:focusableInTouchMode=―true‖android:scrollHorizontally=―true‖android:marqueeRepeatLimit=―marquee_forever‖android:ellipsize=―marquee‖android:background=―@android:color/transparent‖/>ellipsize属性设置当文字过长时,该控件该如何显示。
textview(跑马灯效果)⽂字长短不限循环播放textview显⽰跑马灯效果,使⽤的是继承的⽅法onDraw不停地绘制优点:1.⽂字长短不限哦2.不⽤⾮得获取焦点哦 <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"><feng.f7_27.activity.CustomTextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="match_parent"android:background="#aaffee"/></LinearLayout></LinearLayout>package feng.f7_27.activity;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.os.Parcel;import android.os.Parcelable;import android.util.AttributeSet;import android.view.Display;import android.view.View;import android.view.View.OnClickListener;import android.view.WindowManager;import android.widget.TextView;public class CustomTextView extends TextView implements OnClickListener{public final static String TAG = CustomTextView.class.getSimpleName();private float textLength = 0f;//�ı�����private float viewWidth = 0f;private float step = 0f;//���ֵĺ����private float y = 0f;//���ֵ������private float temp_view_plus_text_length = 0.0f;//��� ������ʱ����private float temp_view_plus_two_text_length = 0.0f;//��� ������ʱ����public boolean isStarting = false;//�Ƿ�ʼ����private Paint paint = null;//��ͼ��ʽprivate String text = "";//�ı�����public CustomTextView(Context context) {super(context);initView();}public CustomTextView(Context context, AttributeSet attrs) {super(context, attrs);initView();}public CustomTextView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);initView();}/***//*** ��ʼ��� �*/private void initView(){setOnClickListener(this);}/***//*** �ı���ʼ����ÿ�θ���ı���� ����ı�Ч��� ����Ҫ���³�ʼ��һ�� */public void init(WindowManager windowManager){paint = getPaint();text = getText().toString();textLength = paint.measureText(text);viewWidth = getWidth();if(viewWidth == 0){if(windowManager != null){Display display = windowManager.getDefaultDisplay();viewWidth = display.getWidth();}}step = textLength;temp_view_plus_text_length = viewWidth + textLength;temp_view_plus_two_text_length = viewWidth + textLength * 2;y = getTextSize() + getPaddingTop()+15;}@Overridepublic Parcelable onSaveInstanceState(){Parcelable superState = super.onSaveInstanceState();SavedState ss = new SavedState(superState);ss.step = step;ss.isStarting = isStarting;return ss;}@Overridepublic void onRestoreInstanceState(Parcelable state){if (!(state instanceof SavedState)) {super.onRestoreInstanceState(state);return;}SavedState ss = (SavedState)state;super.onRestoreInstanceState(ss.getSuperState());step = ss.step;isStarting = ss.isStarting;}public static class SavedState extends BaseSavedState {public boolean isStarting = false;public float step = 0.0f;SavedState(Parcelable superState) {super(superState);}@Overridepublic void writeToParcel(Parcel out, int flags) {super.writeToParcel(out, flags);out.writeBooleanArray(new boolean[]{isStarting});out.writeFloat(step);}public static final Parcelable.Creator<SavedState> CREATOR= new Parcelable.Creator<SavedState>() {public SavedState[] newArray(int size) {return new SavedState[size];}@Overridepublic SavedState createFromParcel(Parcel in) {return new SavedState(in);}};private SavedState(Parcel in) {super(in);boolean[] b = null;in.readBooleanArray(b);if(b != null && b.length > 0)isStarting = b[0];step = in.readFloat();}}/** *//*** ��ʼ����*/public void startScroll(){isStarting = true ;invalidate();}/** *//*** ����*/public void stopScroll(){isStarting = false ;invalidate();}@Overridepublic void onDraw(Canvas canvas) {canvas.drawText(text, temp_view_plus_text_length - step, y, paint); if (!isStarting){return ;}step += 0.5;if (step > temp_view_plus_two_text_length)step = textLength;invalidate();}@Overridepublic void onClick(View v) {if (isStarting)stopScroll();elsestartScroll();}}tv.setText("aaaaaavvv");tv.init(getWindowManager());tv.startScroll();。