Android开发 跑马灯效果的制作
ListView中的TextView实现跑马灯效果
09. <ListView android:id="@+id/list" android:layout_height="wrap_content"
10.
android:layout_width="fill_parent" android:focusable="true"
11.
android:background="@android:color/transparent"></ListView>
58.
}
59.
if (index == position) {
60.
61.
convertView.setBackgroundColor(Color.GREEN);
62.
//此处就是设置textview为选中状态,方可以实现效果
29.
list.add(new Channel("12:55",
30.
"A不喜欢吃鸡蛋,每次发了鸡蛋都给B吃。刚开始B很感谢,久而久之便习惯
了。习惯了,便理所当然了"));
31.
list.add(new Channel(
32.
"14:30",
33.
"于是,直到有一天,A将鸡蛋给了C,B就不爽了。她忘记了这个鸡蛋本来就
02.
03. <?xml version="1.0" encoding="utf-8"?>
04. <LinearLayout xmlns:android="/apk/res/andrntation="vertical" android:layout_width="fill_parent"
AndroidTextView实现跑马灯效果的方法
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跑马灯实现的三种方式
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开发 跑马灯效果的制作
自动完成文本框
• 我们在上网进行搜索的时候,有时会将和输入相关的选项全部列举列出 来供用户选择,该组件的功能和它类似。这就是AutoCompleteTextView。
在该组件的显示中,我们要使用到适配器(绑定相关数据),图示如下:
自动完成文本框
• • 要实现搜索,必须要在内部绑定数据。 实现步骤
</shape> 形状四种 rectangle 矩形(常用), oval 椭圆, line 线性, ring 圆形 颜色 圆角 solid ,gradient (只能2选1) corners
ImageView 属性
1 android:background="@drawable/gril" 设置显示的图片
注意:
onCreateDialog方法要在被显示的方法调用后才会被
回调。
标题栏进度条
创建步骤如下:
1、获得进度条(注意:设置界面布局之前) requestWindowFeature(Window.FEATURE_INDETE RMINATE_PROGRESS); 2、进度条控制方法 a、在窗口标题栏显示进度条
自定义EditText
在项目的开发中,我们有时可能会使用到像如下形式的输入框
那么我们如何完成这种形式的输入框呢? 我们使用的是android:background属性来完成的,它既可以是输入框背
景颜色的设定,也可以是一种绘制形状的引用,这种绘制的形状我们可
以借助于android内部来完成,使用XML配置来进行不同形状的加工,步 骤如下:
•
• • • •
1.定义数据内容
如 "java课程","java简介","java视频","java开发","jsp详解","jsp介绍","jsp开发" 2.构建适配器 适配器作用:将数据和控件绑定显示 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, yout.simple_dropdown_item_1line, data);//将数据设置到适配器
开发板跑马灯实验及步骤
5、编译该工程,成功后将生成映像文件‘helloarm.axf’,打开AXD,装载映像文件‘helloarm.axf’。
6、运行程序,观察结果。
四、实验实现控制所使用的程序
main程序:
#define rGPMCON (*(volatile unsigned *)(0x7F008820))
#define rGPMDAT (*(volatile unsigned *)(0x7F008824))
#define rGPMPUD (*(volatile unsigned *)(0x7F008828))
void msDelay(int time)
{
volatile unsigned int i,j;
while (1)
{
for(i=0; i<ຫໍສະໝຸດ ; i++){
rGPMDAT = ~(1<<i);
msDelay(10);
}
}
}
void LedMain(void)
{
GPIO_Init();
LedTest();
}
Init程序:
IMPORTMain
AREA |C$$code|, CODE, READONLY
用程序通过I/O口实现5个跑马灯的控制
一、实验目的
1、通过实验了解实验系统的结构与使用方法;
2、通过实验了解开发板的电路结构和跑马灯程序的原理;
3、通过实验熟悉开发板对跑马灯控制的实现方法。
二、实验设备及材料
1、飞凌6410开发板及连接开发板和计算机的线路;
2、“DNW.exe”和“Code Warrior for RVDS”等相应的的软件;
android中实现跑马灯效果以及AutoCompleteTestView与MultiAu。。。
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 纵向跑马灯滚动效果
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); }。
Android TextView文字横向自动滚动(跑马灯)
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(跑马灯效果)⽂字长短不限循环播放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();。
麦子学院Android开发教程TextView设置ellipsize=marquee不滚动
今天发现android开发中有一个android:ellipsize=marquee,这个感觉像html中的marquee功能,可以实现滚动效果,于是测试了一下,结果不行呀,后来百度了一下解决办法,下面大家一起来看看。
希望抛砖引玉。
若要让TextView里的文本滚动,必须满足以下几个因素:1,TextView里文本宽度超过TextView的宽度2,android:ellipsize="marquee"3,只有在TextView获取到焦点时,才会滚动.所以加上android:focusableInTouchMode="true" android:focusable="true"最容易忽略的是第三条.滚动重复次数设置:android:marqueeRepeatLimit="marquee_forever"看一个TextView属性android:ellipsize实现跑马灯效果Android系统中TextView实现跑马灯效果,必须具备以下几个条件:1、android:ellipsize=”marquee”2、TextView必须单行显示,即内容必须超出TextView大小3、TextView要获得焦点才能滚动XML代码:android:ellipsize="marquee", android:singleLine="true"Java代码:mTVText.setText;mTVText.setSingleLine(true);mTVText.<>="marquee", android:singleLine="true" mTVText.setEllipsize(TruncateAt.MARQUEE);PS: TextView.setHorizontallyScrolling(true); //让文字可以水平滑动TextView还可以设置跑马灯效果的滚动次数,如下:XML代码设置:android:marqueerepeatlimit="1"。
Android实现文字垂直滚动、纵向走马灯效果的实现方式汇总
Android实现⽂字垂直滚动、纵向⾛马灯效果的实现⽅式汇总⽅法⼀、使⽤系统控件ViewFlipper⽅式:布局⽂件:<ViewFlipperandroid:id="@+id/view_flipper"android:layout_width="300dp"android:layout_height="35dp"android:layout_centerInParent="true"android:autoStart="true"android:background="@drawable/warning_bg"android:flipInterval="3000"android:inAnimation="@anim/slide_in_bottom"android:outAnimation="@anim/slide_out_top"><TextViewandroid:id="@+id/tv_warning_content1"android:layout_width="match_parent"android:layout_height="match_parent"android:ellipsize="middle"android:gravity="center"android:singleLine="true"android:text="有预警信息有预警信息有预警信息"android:textColor="#000000"android:textSize="16sp"/><TextViewandroid:id="@+id/tv_warning_content2"android:layout_width="match_parent"android:layout_height="match_parent"android:ellipsize="middle"android:gravity="center"android:singleLine="true"android:text="当前天⽓状况当前天⽓状况当前"android:textColor="#000000"android:textSize="16sp"/><TextViewandroid:id="@+id/tv_warning_content3"android:layout_width="match_parent"android:layout_height="match_parent"android:ellipsize="middle"android:gravity="center"android:singleLine="true"android:text="123456465"android:textColor="#000000"android:textSize="16sp"/></ViewFlipper>背景⽂件:warning_bg.xml<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="/apk/res/android"android:shape="rectangle"><solid android:color="#34000000"/><corners android:radius="80dp"/></shape>切⼊动画:slide_in_bottom.xml<?xml version="1.0" encoding="utf-8"?><set xmlns:android="/apk/res/android"><translateandroid:duration="1000"android:fromYDelta="100%p"android:toYDelta="0" /></set>切出动画:slide_out_top.xml<?xml version="1.0" encoding="utf-8"?><set xmlns:android="/apk/res/android"><translateandroid:duration="1000"android:fromYDelta="0"android:toYDelta="-100%p" /></set>注意:如果不在布局⽂件⾥设置: android:autoStart="true",可以在代码中动态设置开始循环mViewFlipper.startFlipping();在Activity中显⽰正常,但在fragment中可能会有重影的现象。
走马灯应用的原理
走马灯应用的原理1. 什么是走马灯应用?走马灯应用是一种常见的用户界面设计模式,用于展示一系列内容,通常是图片或者文字。
走马灯应用会在相同位置连续循环显示这些内容,通过自动切换和过渡效果,吸引用户的注意力。
2. 走马灯应用的实现方式走马灯应用的实现方式有多种,下面介绍两种常见的实现方式。
2.1 使用CSS动画和JavaScript一种常见的实现走马灯应用的方式是使用CSS动画和JavaScript。
具体实现步骤如下:1.创建一个包含所有内容的容器,设置定位为相对定位,并设置宽度为容器可以显示的内容宽度。
2.在容器内部创建一个包含所有内容的子容器,设置定位为绝对定位,并设置宽度为所有内容宽度之和。
3.使用CSS动画来实现内容的滚动效果。
可以通过设置动画的keyframes来实现从左到右的滚动效果,也可以通过设置transition来实现平滑的过渡效果。
4.使用JavaScript来控制动画的播放。
可以使用计时器来定时触发动画,或者在用户交互时通过监听事件来触发动画。
2.2 使用JavaScript库除了使用CSS动画和JavaScript来手动实现走马灯应用,还可以使用一些JavaScript库来简化实现过程。
以下是一些常用的JavaScript库:•Slick:一个功能强大且易于使用的走马灯库,提供了丰富的配置选项和自定义样式的能力。
•Swiper:一款移动端优先的走马灯库,支持多种功能,如滑动、淡入淡出等,并具有响应式布局的能力。
•Carousel:一个轻量级的走马灯库,支持无限循环、自动播放和响应式布局。
3. 走马灯应用的优势走马灯应用在用户界面设计中有一些优势,下面列举几点:•提升用户体验:走马灯应用能够以视觉上吸引人的方式展示内容,吸引用户的注意力,提升用户体验。
•节省空间:走马灯应用可以在有限的空间内展示多个内容,节省界面空间。
•易于导航:用户可以通过导航按钮或者滑动手势来切换内容,提供了更直观的导航方式。
Android系列教程:TextView小组件的使用--附带超链接和跑马灯效果
Android系列教程:TextView小组件的使用--附带超链接和跑马灯效果一:新建HelloTextView 工程新建一个Hello world详细步骤可以参见Android教程之三:第一个Android应用,HelloWorld。
创建设置如下:Project name:HelloTextViewBuild Target :android 2.2Application name:HelloTextViewPackage name:com.flysnowcreate Activity:HelloTextViewmin SDK 8然后运行该应用就可以看到TextView的效果,是显示一行字:“Hello World, HelloTextView!”,这是因为新建的Hello项目自带的一个TextView。
二:分析TextView组件TextView是Android中常用的组件之一,可以用他来显示文字,就像一个标签一样,或者你可以认为是html中的span。
对于TextView我们最关心的应该是怎么设置显示的文本,怎样设置字体的大小,字体的颜色,字体的样式,其实很简单,TextView中提供了大量的属性帮我们配置TextView。
1.修改xml配置文件实现。
我们修改main.xml如下:Xml代码< ?xml version="1.0" encoding="utf-8"?>< LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent">< TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:textColor="#ff0000"android:textSize="24sp"android:textStyle="bold"android:text="@string/hello"/>< /LinearLayout>< ?xml version="1.0" encoding="utf-8"?>< LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent">< TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:textColor="#ff0000"android:textSize="24sp"android:textStyle="bold"android:text="@string/hello"/>< /LinearLayout>这里增加了三个属性的设置,分别是android:textColor="#ff0000"设置字体为红色,android:textSize="24sp"设置字体为24sp, android:textStyle="bold"设置字体加粗,预览效果如下图:Android系列教程:TextView小组件的使用--附带超链接和跑马灯效果看到我们的TextView的内容已经变成红色,24sp大,加粗。
Android用TextView实现跑马灯效果代码
Android⽤TextView实现跑马灯效果代码⽬录【前⾔】⼀、新⼿设置跑马灯效果【关键点讲解】【总结】⼆、⾼端玩家设置跑马灯效果三、延伸阅读总结【前⾔】在Textview设置的宽度有限,⽽需要显⽰的⽂字⼜⽐较多的情况下,往往需要给Textview设置跑马灯效果才能让⽤户完整地看到所有设置的⽂字,所以给TextView设置跑马灯效果的需求是很常见的⼀、新⼿设置跑马灯效果1、先在xml中给Textview设置好对应的属性<TextViewandroid:id="@+id/tv"android:layout_width="200dp"android:layout_height="wrap_content"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toBottomOf="@id/show_float"android:singleLine="true"android:ellipsize="marquee"android:focusable="true"android:focusableInTouchMode="true"android:marqueeRepeatLimit="-1"android:layout_marginTop="20dp"android:padding="10dp"android:text="欢迎来到跑马灯新⼿村,这是新⼿⽰例~"android:textColor="@color/white"android:background="@drawable/com_live_rounded_rectangle"/>2、然后在代码中设置请求获取焦点即可TextView tv = findViewById();tv.requestFocus();这样设置之后,跑马灯的效果就出来了【关键点讲解】1、android:layout_width是限制为固定宽度,同时⽂本的长度⼤于所设置的宽度,要是设置android:layout_width为wrap_content, 那么Textview的宽度会随着⽂本长度变长⽽拉宽,这样就不能出现跑马灯效果2、android:singleLine="true"设置Textview只能⼀⾏显⽰,要是不设置为true,默认会⾃动换⾏,显⽰为多⾏,这样的话,也不能出现跑马灯效果3、android:ellipsize="marquee"设置要是⽂本长度超出Textview的宽度时候,⽂本应该以跑马灯效果显⽰,这个是设置跑马灯效果最关键的设置,android:ellipsize还可以取值start、end、middle、none,分别是开头显⽰省略号、结尾显⽰省略号、中间显⽰省略号、直接截断4、android:focusable="true"设置Textview可以获取焦点,跑马灯效果需要获取到焦点时候才⽣效,Textview默认是不获取焦点的5、android:focusableInTouchMode="true"设置在触摸模式下可以获取焦点,⽬前智能机基本都是⾃动进⼊触摸模式,其实⽬前只要设置android:focusableInTouchMode="true",默认android:focusable也会变为true了6、android:marqueeRepeatLimit="-1"设置跑马灯循环的次数,-1表⽰⽆限循环,不设置的话,默认是循环3次7、tv.requestFocus();设置获取焦点,只有当该view的focusable属性为true时候才⽣效【总结】1、⼀定要设置android:focusableInTouchMode="true",若是只设置了android:focusable="true"⽽android:focusableInTouchMode没设置,那么跑马灯效果是不⽣效的,因为进⼊触摸模式之后,isFocusable()返回false,下⾯看看Texivew startMarquee()源码就知道需要满⾜什么条件才会开始跑马灯特效:private void startMarquee() {// Do not ellipsize EditTextif (getKeyListener() != null) return;if (compressText(getWidth() - getCompoundPaddingLeft() - getCompoundPaddingRight())) {return;}// 1、跑马灯控制类没有创建或者跑马灯效果已经停⽌if ((mMarquee == null || mMarquee.isStopped()) &&// 2、当前Textview是获取到焦点或者被选中状态(isFocused() || isSelected())// 3、⽂本的⾏数只有⼀⾏&& getLineCount() == 1// 4、⽂本长度⼤于Textview的宽度&& canMarquee()) {if (mMarqueeFadeMode == MARQUEE_FADE_SWITCH_SHOW_ELLIPSIS) {mMarqueeFadeMode = MARQUEE_FADE_SWITCH_SHOW_FADE;final Layout tmp = mLayout;mLayout = mSavedMarqueeModeLayout;mSavedMarqueeModeLayout = tmp;setHorizontalFadingEdgeEnabled(true);requestLayout();invalidate();}if (mMarquee == null) mMarquee = new Marquee(this);mMarquee.start(mMarqueeRepeatLimit);}}private boolean canMarquee() {int width = mRight - mLeft - getCompoundPaddingLeft() - getCompoundPaddingRight();return width > 0 && (mLayout.getLineWidth(0) > width|| (mMarqueeFadeMode != MARQUEE_FADE_NORMAL && mSavedMarqueeModeLayout != null&& mSavedMarqueeModeLayout.getLineWidth(0) > width));}⼆、⾼端玩家设置跑马灯效果从上⾯总结的TextView跑马灯源码可以看到,只要isFocusable()或者isSelected()⽅法返回true,那么就没必要管是否触摸模式,是否可以获取焦点之类的问题了,所以我们可以⾃定义⼀个类继承于TextView,然后重写isFocusable()直接返回true即可:public class MarqueeTextView extends TextView {public MarqueeTextView(Context context) {super(context);initView(context);}public MarqueeTextView(Context context, AttributeSet attrs) {super(context, attrs);initView(context);}public MarqueeTextView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initView(context);}private void initView(Context context) {this.setEllipsize(TextUtils.TruncateAt.MARQUEE);this.setSingleLine(true);this.setMarqueeRepeatLimit(-1);}//最关键的部分public boolean isFocused() {return true;}}1、直接在Xml中使⽤⾃定义的MarqueeTextView,那么跑马灯效果就出来了,⽆需任何额外配置<com.example.MarqueeTextViewandroid:id="@+id/tv"android:layout_width="200dp"android:layout_height="wrap_content"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toBottomOf="@id/show_float"android:layout_marginTop="20dp"android:padding="10dp"android:text="欢迎来到跑马灯⾼端玩家局,这是⾼端玩法⽰例~"android:textColor="@color/white"android:background="@drawable/com_live_rounded_rectangle"/>来看看效果:三、延伸阅读假如有这样⼀个需求:因为显⽰⽂本的空间有限,所以只能⽤跑马灯的效果来给⽤户展⽰⽂本,但是在⽤户完整地看完⼀遍⽂本之后,需要隐藏掉Textview,那么问题来了,我们怎么知道跑马灯效果什么时候跑完⼀遍呢?先来看看Textview跑马灯部分Marquee类的部分源码:void start(int repeatLimit) {//重复次数设置0,那就直接停⽌跑马灯if (repeatLimit == 0) {stop();return;}//...省略掉⼤部分不相关的代码mChoreographer.postFrameCallback(mStartCallback);}}private Choreographer.FrameCallback mStartCallback = new Choreographer.FrameCallback() {@Overridepublic void doFrame(long frameTimeNanos) {mStatus = MARQUEE_RUNNING;mLastAnimationMs = mChoreographer.getFrameTime();tick();}};void tick() {if (mStatus != MARQUEE_RUNNING) {return;}if (textView != null && (textView.isFocused() || textView.isSelected())) {long currentMs = mChoreographer.getFrameTime();long deltaMs = currentMs - mLastAnimationMs;mLastAnimationMs = currentMs;float deltaPx = deltaMs * mPixelsPerMs;mScroll += deltaPx;//要是跑马灯滚动的距离⼤于最⼤距离,那么回到给mRestartCallbackif (mScroll > mMaxScroll) {mScroll = mMaxScroll;mChoreographer.postFrameCallbackDelayed(mRestartCallback, MARQUEE_DELAY);} else {mChoreographer.postFrameCallback(mTickCallback);}textView.invalidate();}}private Choreographer.FrameCallback mRestartCallback = new Choreographer.FrameCallback() {@Overridepublic void doFrame(long frameTimeNanos) {if (mStatus == MARQUEE_RUNNING) {if (mRepeatLimit >= 0) {mRepeatLimit--;}start(mRepeatLimit);}}}从上⾯对Marquee源码分析可知,跑马灯跑完⼀轮之后会调⽤到Marquee类mRestartCallback对象的doFrame⽅法,那么我们来⼀招“偷龙转凤”,通过反射把mRestartCallback对象替换成我们⾃⼰实例化的对象,那么在跑马灯跑完⼀轮之后就会回调到我们替换的对象中,这样就实现了对跑马灯效果跑完⼀轮的监听,实现源码如下:public class MarqueeTextView extends androidx.appcompat.widget.AppCompatTextView {private Choreographer.FrameCallback mRealRestartCallbackObj;private Choreographer.FrameCallback mFakeRestartCallback;private OnShowTextListener mOnShowTextListener;public MarqueeTextView(Context context, OnShowTextListener onShowTextListener) {super(context);initView(context);this.mOnShowTextListener = onShowTextListener;}public MarqueeTextView(Context context, AttributeSet attrs) {super(context, attrs);initView(context);}public MarqueeTextView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initView(context);}private void initView(Context context) {//绕过隐藏api的限制Reflection.unseal(context.getApplicationContext());//设置跑马灯⽣效条件this.setEllipsize(TextUtils.TruncateAt.MARQUEE);this.setSingleLine(true);this.setFocusable(true);//反射设置跑马灯监听try {//从TextView类中找到定义的字段mMarqueeField marqueeField = ReflectUtil.getDeclaredField(TextView.class, "mMarquee");//获取Marquee类的构造⽅法Marquee(TextView v)Constructor declaredConstructor = ReflectUtil.getDeclaredConstructor(Class.forName("android.widget.TextView$Marquee"), TextView.class); //实例化⼀个Marquee对象,传⼊参数是Textview对象Object marqueeObj = declaredConstructor.newInstance(this);//从Marquee类中找到定义的字段mRestartCallback,重新开始⼀轮跑马灯时候会回调到这个对象doFrame()⽅法Field restartCallbackField = ReflectUtil.getDeclaredField(Class.forName("android.widget.TextView$Marquee"), "mRestartCallback");//从Marquee实例对象中获取到真实的mRestartCallback对象mRealRestartCallbackObj = (Choreographer.FrameCallback) restartCallbackField.get(marqueeObj);//构造⼀个假的mRestartCallback对象,⽤来监听什么时候跑完⼀轮跑马灯效果mFakeRestartCallback = new Choreographer.FrameCallback() {@Overridepublic void doFrame(long frameTimeNanos) {//这⾥还是执⾏真实的mRestartCallback对象的代码逻辑mRealRestartCallbackObj.doFrame(frameTimeNanos);Log.i("min77","跑马灯⽂本显⽰完毕");//回调通知跑完⼀轮if(MarqueeTextView.this.mOnShowTextListener != null){MarqueeTextView.this.mOnShowTextListener.onComplete(0);}}};//把假的mRestartCallback对象设置给Marquee对象,其实就是代理模式restartCallbackField.set(marqueeObj, mFakeRestartCallback);//把⾃⼰实例化的Marquee对象设置给TextviewmarqueeField.set(this, marqueeObj);} catch (Exception e) {e.printStackTrace();Log.e("min77",e.getMessage());}}//最关键的部分public boolean isFocused() {return true;}/*** 是否显⽰完整⽂本*/public interface OnShowTextListener{void onComplete(int delayMillisecond);}}效果如下:总结到此这篇关于Android TextView实现跑马灯效果代码的⽂章就介绍到这了,更多相关Android TextView跑马灯效果内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
TextView实现跑马灯效果
TextView实现跑马灯效果⽹上有很多跑马灯的介绍,有很多跑马灯的代码。
或许我的不是最好的,但是应该很容易明⽩的。
我们先来介绍⼀个跑马灯的代码1 <LinearLayout xmlns:android="/apk/res/android"2 android:layout_width="match_parent"3 android:layout_height="match_parent"4 android:orientation="vertical">56 <TextView7 android:id="@+id/wisdom_tv"8 android:layout_width="wrap_content"9 android:layout_height="wrap_content"10 android:text="你必须⾮常努⼒,才能看起来毫不费劲!-Moon同学的励志语⾔"11 android:textSize="24sp"12 android:singleLine="true"13 android:ellipsize="marquee"14 android:focusableInTouchMode="true"15 android:focusable="true"/>1617 <!--18 android:ellipsize="start" 省略号在开头19 android:ellipsize="middle" 省略号在中间20 android:ellipsize="end" 省略号在结尾21 android:ellipsize="marquee" 跑马灯显⽰22 -->23 <!--24 android:singleLine="true" 内容只能显⽰在⼀⾏25 android:focusableInTouchMode="true" 通过touch来获得focus26 android:focusable="true" 是否可以获取焦点27 -->28 </LinearLayout>当然如果是⼀个跑马灯的话,那么这个就完全可以了,但是在以后的开发中,布局会很复杂的,如果出现两个以上的跑马灯的话,那么重复上⾯的代码,那么是实现不了的,那么两个以上的应该要怎么做呢?layout布局的代码如下1 <LinearLayout xmlns:android="/apk/res/android"2 xmlns:tools="/tools"3 android:layout_width="match_parent"4 android:layout_height="match_parent"5 android:orientation="vertical" >67 <com.shxt.xkl.MaequeeText8 android:layout_width="wrap_content"9 android:layout_height="wrap_content"10 android:ellipsize="marquee"11 android:focusable="true"12 android:focusableInTouchMode="true"13 android:singleLine="true"14 android:text="你必须⾮常努⼒,才能看起来毫不费劲,你必须⾮常努⼒,才能看起来毫不费劲." />1516 <com.shxt.xkl.MaequeeText17 android:layout_width="wrap_content"18 android:layout_height="wrap_content"19 android:ellipsize="marquee"20 android:focusable="true"21 android:focusableInTouchMode="true"22 android:singleLine="true"23 android:text="你必须⾮常努⼒,才能看起来毫不费劲,你必须⾮常努⼒,才能看起来毫不费劲." />2425 </LinearLayout>在新建⼀个TextView的⼦类1public class MaequeeText extends TextView {23public MaequeeText(Context context) {4super(context);5 }67// 重写所有的构造函数 Source==>Generate Constructors from Superclass8public MaequeeText(Context context, AttributeSet attrs, int defStyle) {9super(context, attrs, defStyle);10 }1112public MaequeeText(Context context, AttributeSet attrs) {13super(context, attrs);14 }1516 @Override17public boolean isFocused() {18return true;19// ⾃定义设置让focusable为true20// 这个⽅法相当于在layout中21// android:focusable="true"22// android:focusableInTouchMode="true"23 }24 }以上代码就能解决了今后多个跑马灯的问题了,希望对⼤家有帮助! ~Moon童鞋。
知识共享-android TextView各种效果(雷惊风)
常用控件应用之文本框(TextView)特效1.TextView之跑马灯效果android:ellipsize属性使用之跑马灯效果android:ellipsize设置当文字过长时,该控件该如何显示。
有如下值设置:"start"—–省略号显示在开头"end"——省略号显示在结尾"middle"—-省略号显示在中间"marquee" ——以跑马灯的方式显示(动画横向向左移动)布局文件中给TextView加入如下属性即可:android:ellipsize="marquee"android:marqueeRepeatLimit="marquee_forever"android:focusable="true"android:focusableInTouchMode="true"布局文件中设置如下(完整代码稍后给出)<TextViewandroid:id="@+id/marquee_effect"android:layout_width="100dip"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:ellipsize="marquee"android:focusable="true"android:focusableInTouchMode="true"android:marqueeRepeatLimit="marquee_forever"android:singleLine="true"android:text="@string/marquee_effect" />如果一个页面想实现多个TextView同时跑马灯效果解决方案:给要跑动的textview加上如下代码就行了textview.setSelected(true);2.TextView之阴影效果(可在布局文件里加入如下属性进行设置也可通过程序设置)android:shadowDx——设置阴影横向坐标开始位置(相对于文本内容)android:shadowDy——设置阴影纵向坐标开始位置(相对于文本内容)android:shadowRadius——设置阴影的半径android:shadowColor——指定文本阴影的颜色//关键代码(完整代码稍后给出)textview.setShadowLayer(2.5f, 15, -10, 0xff00ff00);3.html标签设置样式效果补充:textView.setAutoLinkMask(Linkify.WEB_URLS);// 当文本内容中包含超链接格式的文本时,自动转换成超链接样式,点击会自动跳转到指定的网页textView.setAutoLinkMask(Linkify.PHONE_NUMBERS);//自动转手机号码点击它可进入系统拨号界面textView.setAutoLinkMask(Linkify.EMAIL_ADDRESSES);//自动转邮件地址点击它可发送邮件(要提前设置好自己的电子邮件)textView.setAutoLinkMask(Linkify.MAP_ADDRESSES);//自动转街道地址点击它可查看位置(前提已安装了google地图)textView.setAutoLinkMask(Linkify.ALL);//包括上面4种情况关键代码(完整代码稍后给出):TextView tv = (TextView) findViewById(R.id.fromhtml_effect);StringBuffer sb = new StringBuffer();sb.append("<h1><font color='#ff0000'>Html标签方式:</font></h1>");sb.append("<h6><b><i><font color='#00ff00'><ahref='/bravestarrhu/'>");sb.append(getString(R.string.fromhtml_effect));sb.append("</a></font></i></b></h6>");tv.setText(Html.fromHtml(sb.toString()));tv.setMovementMethod(LinkMovementMethod.getInstance());// 这句很重要,使超链接<a href>起作用4.TextView之动画效果(rotate旋转、alpha透明度、scale缩放、translate移动)实现动画需要在res/anim目录下新建对应的xml文件(稍后给出)关键代码(完整代码稍后给出):TextView tv = null;// TextView旋转动画效果tv = (TextView) findViewById(R.id.rotate);Animation mAnimationRight = AnimationUtils.loadAnimation(TextViewEffectActivity.this, R.anim.rotate);tv.setAnimation(mAnimationRight);// TextView透明度动画效果tv = (TextView) findViewById(R.id.alpha);mAnimationRight = AnimationUtils.loadAnimation(TextViewEffectActivity.this, R.anim.alpha);tv.setAnimation(mAnimationRight);// TextView缩放动画效果tv = (TextView) findViewById(R.id.scale);mAnimationRight = AnimationUtils.loadAnimation(TextViewEffectActivity.this, R.anim.scale);tv.setAnimation(mAnimationRight);// TextView移动动画效果tv = (TextView) findViewById(R.id.translate);mAnimationRight = AnimationUtils.loadAnimation(TextViewEffectActivity.this, R.anim.translate);tv.setAnimation(mAnimationRight);5.TextView之霓虹灯效果采用timer+TimerTask+Handler实现主要用到SpannableStringBuilder对象关键代码(完整代码稍后给出):// 霓虹灯效果(此段代码会使"光"变红色)String wholeContent = "欢迎光临";SpannableStringBuilder spannable = new SpannableStringBuilder(wholeContent);spannable.setSpan(new ForegroundColorSpan(Color.RED), 2,3, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); // 设置指定位置文字的颜色(索引0开始)6.TextView之包含图片的效果实现步骤(1.构建ImageGetter;2.直接使用append进行追加)关键代码(完整代码稍后给出):TextView tv = (TextView) findViewById(R.id.image_effect);tv.setText(R.string.image_effect);// 通过HTML标记获得res目录下指定的图片ImageGetter imageGetter = new ImageGetter() {@Overridepublic Drawable getDrawable(String source) {int id = Integer.parseInt(source);// 根据id从资源文件中获取图片对象Drawable d = getResources().getDrawable(id);d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());return d;}};tv.append(Html.fromHtml("<img src='" + R.drawable.log + "'/>",imageGetter, null));完整代码:1>清单文件AndroidManifest.xml<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="/apk/res/android"package="com.bravestarr.app.textvieweffect"android:versionCode="1"android:versionName="1.0"><uses-sdk android:minSdkVersion="7"/><applicationandroid:icon="@drawable/ic_launcher"android:label="@string/app_name"><activityandroid:name=".TextViewEffectActivity"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="UNCHER"/> </intent-filter></activity></application></manifest>2>main.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"><!--android:ellipsize属性使用之跑马灯效果android:ellipsize设置当文字过长时,该控件该如何显示。
Android使用Recyclerview实现图片水平自动循环滚动效果
Android使⽤Recyclerview实现图⽚⽔平⾃动循环滚动效果简介:本篇博客主要介绍的是如何使⽤RecyclerView实现图⽚⽔平⽅向⾃动循环(跑马灯效果)效果图:思路:1.准备m张图⽚1.使⽤Recyclerview实现,返回⽆数个(实际Interge.MAXVALUE)item,第n个item显⽰第n%m张图⽚3.使⽤recyclerview.scrollBy 每个⼀段时间⽔平滚动⼀段距离4.通过layoutManager.findFirstVisibleItemPosition()获取当前显⽰的第⼀个View是第⼏个item,上⾯的ImageView显⽰对应de图⽚实现代码:XML⽂件1.activity布局⽂件activity_recy.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="vertical"><ImageViewandroid:layout_width="300dp"android:layout_height="350dp"android:layout_gravity="center_horizontal"android:id="@+id/img"android:src="@drawable/p5"android:scaleType="fitXY"/><android.support.v7.widget.RecyclerViewandroid:layout_width="match_parent"android:layout_height="150dp"android:layout_marginTop="10dp"android:id="@+id/recyclerview"></android.support.v7.widget.RecyclerView></LinearLayout>2.适配器布局item_horizon.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="wrap_content"android:layout_height="match_parent"android:orientation="vertical"><ImageViewandroid:layout_width="100dp"android:layout_height="match_parent"android:id="@+id/img"android:layout_marginLeft="5dp"android:layout_marginRight="5dp"android:scaleType="fitXY"/></LinearLayout>Activitypublic class HorizontalActivity extends AppCompatActivity implements RecyAdapter.OnItemClickListener {private String TAG="HorizontalActivity";@BindView(R.id.img)ImageView img;@BindView(R.id.recyclerview)RecyclerView recyclerview;private Integer[] mImgIds = {R.drawable.p1, R.drawable.p2, R.drawable.p3, R.drawable.p4, R.drawable.p5,R.drawable.pic1, R.drawable.pic5, R.drawable.pic6};private List<Integer> datas;private RecyAdapter recyAdapter;private Handler mHandler=new Handler();private LinearLayoutManager layoutManager;private int oldItem=0;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_recy);ButterKnife.bind(this);initData();initRecy();img.setImageResource(datas.get(0));recyAdapter.setOnItemClickListener(this);}Runnable scrollRunnable=new Runnable() {@Overridepublic void run() {recyclerview.scrollBy(3,0);// int firstItem = layoutManager.findFirstVisibleItemPosition();int firstItem=layoutManager.findFirstVisibleItemPosition();if(firstItem!=oldItem&&firstItem>0){oldItem=firstItem;img.setImageResource(datas.get(oldItem%datas.size()));}Log.e(TAG, "run: firstItem:"+firstItem );mHandler.postDelayed(scrollRunnable,10);}};private void initRecy() {recyAdapter=new RecyAdapter(this,datas);layoutManager = new LinearLayoutManager(this);layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);recyclerview.setLayoutManager(layoutManager);recyclerview.setAdapter(recyAdapter);}private void initData() {datas=new ArrayList<>();for (int i = 0; i <mImgIds.length ; i++) {datas.add(mImgIds[i]);}}@Overrideprotected void onResume() {super.onResume();mHandler.postDelayed(scrollRunnable,10);}@Overrideprotected void onStop() {super.onStop();mHandler.removeCallbacks(scrollRunnable);}@Overridepublic void onItemClick(View view, int tag) {Toast.makeText(this,"第"+tag+"张图⽚被点击了",Toast.LENGTH_SHORT).show();}}适配器RecyAdapterpublic class RecyAdapter extends RecyclerView.Adapter<RecyAdapter.ViewHolder> implements View.OnClickListener { private Context context;private List<Integer> datas;private OnItemClickListener onItemClickListener;public RecyAdapter(Context context, List<Integer> datas) {this.context = context;this.datas = datas;}@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = LayoutInflater.from(context).inflate(yout.item_horizontal, parent, false);ViewHolder vh=new ViewHolder(view);view.setOnClickListener(this);return vh;}@Overridepublic void onBindViewHolder(ViewHolder holder, int position) {int newPos=position%datas.size();holder.img.setImageResource(datas.get(newPos));holder.itemView.setTag(position);}@Overridepublic int getItemCount() {return Integer.MAX_VALUE;}@Overridepublic void onClick(View view) {if(onItemClickListener!=null){onItemClickListener.onItemClick(view, (Integer) view.getTag());}}class ViewHolder extends RecyclerView.ViewHolder {ImageView img;public ViewHolder(View itemView) {super(itemView);img=itemView.findViewById(R.id.img);}}public void setOnItemClickListener(OnItemClickListener listener){this.onItemClickListener=listener;}interface OnItemClickListener{void onItemClick(View view,int tag);}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2、在布局文件中进行引用
自定义EditText shape用法
shape xml 文件 作用:自定义控件背景。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="/apk/res/android" android:shape="rectangle"> <solid android:color="#FFFFFF"/> <corners android:radius="10dp"/>
前言
Android课程
android开发应用核心课程
第四章 Android基础用户界面
一 二 TextView基本属性 TextView实现跑马灯效果 EditText基本属性 自定义EditText
三
四 五
ImageView 基本属性
自动完成文本框 进度条
TextView基本属性
自动完成文本框
• 我们在上网进行搜索的时候,有时会将和输入相关的选项全部列举列出 来供用户选择,该组件的功能和它类似。这就是AutoCompleteTextView。
在该组件的显示中,我们要使用到适配器(绑定相关数据),图示如下:
自动完成文本框
• • 要实现搜索,必须要在内部绑定数据。 实现步骤
•
• • • •
1.定义数据内容
如 "java课程","java简介","java视频","java开发","jsp详解","jsp介绍","jsp开发" 2.构建适配器 适配器作用:将数据和控件绑定显示 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, yout.simple_dropdown_item_1line, data);//将数据设置到适配器
自动完成文本框
• 3.为控件绑定适配器 • act.setAdapter(adapter);
进度条
• 我们在安装一些软件时,经常会看到进度条显示安装进度。或者我们在 执行一些比较耗时的程序时,系统会弹出一个进度对话框提示用户等待。 • 在Android系统中进度条有很多种: 对话框进度条 标题栏进度条 水平进度条
注意:
onCreateDialog方法要在被显示的方法调用后才会被
回调。
标题栏进度条
创建步骤如下:
1、获得进度条(注意:设置界面布局之前) requestWindowFeature(Window.FEATURE_INDETE RMINATE_PROGRESS); 2、进度条控制方法 a、在窗口标题栏显示进度条
总结: singleLine--->ellipsize--->marqueeRepeatLimit --->focusable--->focusableInTouchMode
EditText基本属性
EditText 中的常见属性
android:textStyle="bold" 字体样式
android:textColor 字体颜色 android:textSize="20sp" 字体大小
自定义EditText
在项目的开发中,我们有时可能会使用到像如下形式的输入框
那么我们如何完成这种形式的输入框呢? 我们使用的是android:background属性来完成的,它既可以是输入框背
景颜色的设定,也可以是一种绘制形状的引用,这种绘制的形状我们可
以借助于android内部来完成,使用XML配置来进行不同形状的加工,步 骤如下:
对话框进度条
创建步骤如下:
1、重写Activity的onCreateDialog()方法,并 在其中创建对话框。 ProgressDialog pd = new ProgressDialog(this);
pd.setTitle("测试对话框");
pd.setMessage("程序正在加载请稍后!"); pd.setCancelable(true); 2、调用Activity的showDialog()方法,显示进度条 对话框。
</shape> 形状四种 rectangle 矩形(常用), oval 椭圆, line 线性, ring 圆形 颜色 圆角 solid ,gradient (只能2选1) corners
ImageView 属性
1 android:background="@drawable/gril" 设置显示的图片
android:hint="请输入数字!" 设置显示在控件上的提示信息
android:password ="true" 以小点”.”显示文本,推荐输入密码时使用。 android:singleLine="true" 设置单行输入 android:maxLength 设置最大输入字符数 android:editable 是否可编辑 android:numeric / android:phoneNumber只接受数字 android:inputType 限制输入类型 android:cursorVisible 设定光标为显示/隐藏
android:textStyle 设置字体样式[bold(粗体) , italic(斜体) , bold|italic(又粗又斜)]
TextView实现跑马灯
TextView 实现跑马灯效果
1、设置显示内容为单行显示
2、设置文本内容过长时的省略模式 3、设置重复滚动的次数 4、设置控件能够获得焦点 5、在触摸模式下能够获得焦点
2.
android:scaleType="fitXY"
//设置图片在控件中显示的样式
scaleType 的取值 及含义 center----按图片的原来尺寸居中显示 ,当图片的长/宽超过 View的长宽,则截取
图片的居中部分显示。
fitXY-----把图片不按比例扩大/缩小到View的大小显示
创建TextView的方式
A、在程序中创建TextView对象 B、在XML布局文件中定义TextView控件(强烈推荐)
TextView中的属性
android:text 设置显示文本内容 android:textSize 设置文字大小,推荐度量单位”sp”,“dp”也可以
android:textColor 设置文本颜色
法增加或者减少进度,同时也可以设置第二进度
setProgressBarIndeterminateVisibility(true);
b、在窗口标题栏取消进度条 setProgressBarIndeterminateVisibility(false);
水平进度条
创建步骤如下:
1、在布局文件中声明ProgressBar。 设置样式为水平 style="?android:attr/progressBarStyleHorizontal" 2、在Activity中获得ProgressBar实例。 3、调用ProgressBar的incrementProgressBy()方