0%

TextView more fun

图文混排

其实也就是HTML的操作,只不过有一点比较特殊,就是在使用img标签的时候我们需要提供一个接口对象,用来提供我们的图片资源ID,如果资源ID非常非常的多,我们用大量的if语句是非常的麻烦的,而且后期维护性非常的差,所以我们就用到反射的帮助,首先我们构建一个获取资源ID的函数:

1
2
3
4
5
6
7
8
9
10
11
12

private int getDrawableResureID(String imageName) throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException
{
try {
Field field = R.drawable.class.getField(imageName);
return Integer.parseInt(field.get(null).toString());
} catch (NoSuchFieldError e) {
// TODO: handle exception
e.printStackTrace();
}
return 0;
}

这个函数其实就是说提供一个String类型的值,我们通过反射获取类中对应的资源ID。

既然可以这样我们就可以写代码实现img标签的功能了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Tv_One = (TextView) findViewById(R.id.Tv_One);
String text1 = "<font color = 'blue'>Hello Wker</font><img src='ic_l1'/>";
text1 += "<font color = 'blue'>Hello Wker1</font><img src='ic_l2'/>";
text1 += "<font color = 'blue'>Hello Wker2</font><img src='ic_l3'/>";
CharSequence text = Html.fromHtml(text1, new ImageGetter() {

@Override
public Drawable getDrawable(String source) {
//根据资源ID获取图片
try {
Drawable drawable = getResources().getDrawable(getDrawableResureID(source));
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
return drawable;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}, null);
Tv_One.setText(text);

我们先配置一下HTML标签,居住我们的src要和我们文件的名称一样,因为我们是反射来获取的,R文件的资源就是这样的,获取滞后我们用fromHTML获取CharSequence对象,记得我们用Drawable的时候我哦们还需要设置Drawable的边界,否则会出错,我们可以调节Drawable的宽高实现缩放。
图文混排
资源名称

文本跳转

这个就是不需要HTML的标签我们自己写这个跳转,其实也不是跳转了,就是一个段文本的点击事件:
代码片段如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
String text = "OK点我打开";
SpannableString span = new SpannableString(text);
span.setSpan(new ClickableSpan() {

@Override
public void onClick(View widget) {
// TODO Auto-generated method stub
Intent in = new Intent(MainActivity.this,jmp_class.class);
startActivity(in);
}
}, 2,text.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE );//SPAN_EXCLUSIVE_EXCLUSIVE这个是不包含前后
Tv_One.setText(span);
Tv_One.setMovementMethod(LinkMovementMethod.getInstance());//响应点击

首先先是new一个SpannableString的对象,这个对象的构造方法就是一个文本,然后setSapn方法的第一个参数就是一个点击的对象,这个对象其实中的onClick方法就是当点击指定文本的时候我们响应的时间,这里我们是打开一个Activity,第二三个参数是起始位置和结束为止,在设置文本,然后在确定有响应点击。
实现效果

跑马灯效果

其实跑马灯这个效果就是之前写Win32说的那种KTV效果,就是一些字符在这跑动,在安卓中是比较简单的,首先我们添加一个TextView,如下配置:

1
2
3
4
5
6
7
8
9
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="True"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:text="啊啊165461654986啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊" />
  1. android:singleLine="True"这个第意思是说TextView是单行的
  2. android:ellipsize="marquee"这个说名他是滚动的,可以设置为前面或者后面啥的三个点
  3. android:focusable="true"这个说明是可以获取焦点的,想一下其实TextView就是一个静态文本,Windows下这个东西是不能获得焦点的。
  4. android:focusableInTouchMode="true"这个说是支持触摸获得焦点的。

效果点开就是发现他是跑马灯效果。但是我们知道,只要焦点一消失,我们就不会动了,比如说EditText输入东西我们就不能获取了,那么我们之后自己写一个TextView来让我们的焦点一直存在。

增加两个组件:

1
2
3
4
5
6
7
8
9
10
11
<EditText 
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<com.example.android_stduy1.MyTextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="True"
android:ellipsize="marquee"
android:text="啊啊165461654986啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊" />

这个EditText是用来让第一个失去焦点的,下面这个由于我们是强制拥有假的焦点,那么第三四个就不要了,这个时候我们添加一个类:”MyTextView.java”,这个我们自己写一个TextView。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.example.android_stduy1;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;

public class MyTextView extends TextView{


public MyTextView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}

public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}

public MyTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}

@Override
public boolean isFocused() {
// TODO Auto-generated method stub
return true;
}
}

重写这个类的时候有一点非常注意,我就在这里踩坑了,就是我们的构造函数要写三个,原因具体不清楚,可能是都有可能调用的原因吧,然后我们重写isFocused方法,让他一直都以为有焦点。这个样子我们就可以了,看下效果:
实现效果