文档章节

Android 动态图文混排的常用方法

IamOkay
 IamOkay
发布于 2015/02/07 09:06
字数 599
阅读 8785
收藏 7

DrawableIcon的设置

对于TextView或者EditText动态设置drawableLeft,drawableRight,drawableTop,drawableBottom,drawableStart,drawableEnd的方法总结

Android中提供了许多动态设置的方法

但是用中容易造成的问题是,我们往往只调用了如上的一些方法,但并没有将Drawable的Bounds设置为特定的数据,导致这些图片无法显示,因此,做如下操作即可

设置右方向上的图片

Drawable drawable = getResources().getDrawable(R.drawable.hotel_search);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
selectCityTv.setCompoundDrawables(null, null, drawable, null);

或者我们可以使用另外一些方法

selectCityTv.setCompoundDrawablesWithIntrinsicBounds( Drawable  left, Drawable  top,Drawable  right,Drawable  bottom)

TextPaint+Html实现TextView图文混排

使用SpannableString

实现URL的自动匹配:

URLSpan可以自行匹配,Image需要使用到Html,这基本解决了80%的开发需求

 TextView tv = (TextView) findViewById(R.id.myTextView);
                 
                tv.setMovementMethod(LinkMovementMethod.getInstance());
                String htmlSource = "<a href='http://m.baidu.com'>百度</a>" +
                        "<br/>图1<br/><img src='ic_hua1'/>" +
                        "<br/>图2<br/><img src='ic_hua2'/>" +
                        "<br/>图3<br/><img src='ic_hua3'/>" +
                        "<br/>图4<br/><img src='ic_hua4'/>" +
                        "<br/><a href='http://m.sina.com.cn'>新浪</a>"+
                        "<br/>联系电话:<a href='tel:130888954276'>130888954276</a>";
                resources = getResources();
                CharSequence charSequence = Html.fromHtml(htmlSource,new Html.ImageGetter() {
                    @Override
                    public Drawable getDrawable(String source) {
                        int identifier = resources.getIdentifier(source, "drawable", getPackageName());
                        Log.e("identifier", "identifier="+identifier);
                        Drawable drawable = resources.getDrawable(identifier);
                        drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
                          
                         return drawable;
                    }
                },null);
                 
                SpannableString spanStr = new SpannableString(charSequence);
                 
                URLSpan[] urlspans = spanStr.getSpans(0, spanStr.length(), URLSpan.class);
                for (URLSpan urlspan : urlspans) 
                {
                    Log.d("url", "url="+urlspan.getURL());
                    spanStr.setSpan(new URLSpan(urlspan.getURL()){
                        @Override
                        public void updateDrawState(TextPaint ds) {
                            super.updateDrawState(ds);
                            //设置删除线
                            ds.setFlags(TextPaint.STRIKE_THRU_TEXT_FLAG);
                            //设置下划线
                            ds.setUnderlineText(true);
                            //设置颜色
                            ds.setColor(0xfff90202);
                        }
                        @Override
                        public void onClick(View widget) {
                            Log.e("widget", "url="+getURL());
                            try {
                                URI uri = new URI(getURL());
                                if("http".equalsIgnoreCase(uri.getScheme()) || "https".equalsIgnoreCase(uri.getScheme()))
                                {
                                    //网络请求
                                }else if("tel".equalsIgnoreCase(uri.getScheme())){
                                    //电话
                                }
                                else if("mailto".equalsIgnoreCase(uri.getScheme()))
                                {
                                    //邮箱
                                }else if("page".equalsIgnoreCase(uri.getScheme())){
                                    //Activity 跳转
                                }
                            } catch (URISyntaxException e) {
                                e.printStackTrace();
                            }
                        }
                         
                    }, spanStr.getSpanStart(urlspan), spanStr.getSpanEnd(urlspan), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                }
                tv.setText(spanStr);

类似QQ的气泡上的图片,不一定是表情图片,因此,这里我们需要实现异步加载图片的方案,具体实现使用ImageLoader即可

使用 TextPaint修改画笔

TextPaint 属于原始的绘制工具
TextPaint tp = textView.getPaint();
我们通过设置画壁来实现图文混排
tp.setXXX

ClickableSpan,URLSpan点击时的高亮背景色

点击时容易出现默认背景色,但是无法通过setBgColor来修改

结局这种淡绿色高亮的方法如下

((TextView)view).setHighlightColor(getResources().getColor(android.R.color.transparent));

try doing it

© 著作权归作者所有

IamOkay

IamOkay

粉丝 205
博文 483
码字总数 403228
作品 0
海淀
程序员
私信 提问
加载中

评论(1)

feer
feer
不错,有实用
Android 解决图文混排,图片和文字居中对齐问题(ImageSpan)

一. 概述 众所周知,Android图文混排可以通过SpannableString来实现,通过在相应位置使用ImageSpan替换即可,但是使用过的人会发现,imageSpan只提供了两种对齐方式,如下所示: 但是在大多数...

Mr云台
2017/04/10
0
0
同 android TextView 自动换行之后如果让每行的文本和图片都垂直居中,在这里我使用的textview显示html

院子里一哥们提问的问题 我遇到的相同的情况 同问 在TextView默认的情况下,显示的html如果是图文混排的时候是这种以底部对齐的,但是这样的效果不符合需求,但是看见猿题库这样的软件实现了...

chenyongrenren
2014/10/11
1K
0
Android中的File文件存储及读取file中的Bitmap

今年看了下android的文件存储,大致和java实现差不多 android提供了如下两个方法来打开本应用程序的数据文件的IO流: FileInputStream openFileInput(fileName); //输入流 FileOutputStream...

爱吃橙子的小石头
2014/12/07
2.2K
0
Android图片缓存之初识Glide

前言: 前面总结学习了图片的使用以及Lru算法,今天来学习一下比较优秀的图片缓存开源框架。技术本身就要不断的更迭,从最初的自己使用SoftReference实现自己的图片缓存,到后来做电商项目自...

丁佳辉
2017/10/18
23
0
Android自动解析html带图片,实现图文混排

在android中,如何将html代码转换为text,然后显示在textview中呢,有一个简单直接的方法: textView.setText(Html.fromHtml(content)); 然而用的时候却发现html里面的图片没法被被解析出来,...

妖久
03/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Git

指令 git init :创建版本库,生成.git文件夹 git add XX:上传代码到暂存区 git state:查看目前本地工作起、暂存区、分支,三者之间的文件状态 git diff demo.html:查看工作区和暂存区的代码...

Hui先生
37分钟前
6
0
绘制流程图用什么软件好?分享绘制流程图的简单方法

绘制流程图一般有两种方法,一种是手绘,另一种是利用画图工具进行绘制,更多的人们选择使用第二种方法进行绘制,方便简单。那绘制流程图用什么软件好?若是使用电脑进行绘制,可以选择迅捷画...

百因必有果
39分钟前
8
0
PHP制作的掷色子点数抽奖游戏实例

PHP制作的掷色子点数抽奖游戏实例,通过掷色子点数来达到抽奖的效果,为抽奖活动增添一些趣味性。 我们将在html页面中写下如下的html结构代码,.wrap用来放置色子和提示信息,#prize则是用来...

ymkjs1990
52分钟前
5
0
宝塔免费版部署

宝塔免费版部署 NiuSHOP安装环境及宝塔一键部署免费版 1、Niushop安装环境 操作系统:支持Windows和linux 服务器:支持Apache/Nginx/IIS服务器 PHP5.6版本及以上,最高支持PHP7.2,MySQL版本...

Geek-Chic
今天
5
0
MySQL查询优化临时表

【理论分析】 MySQL在执行SQL查询时可能会用到临时表,一般情况下,用到临时表就意味着性能较低。 临时表存储 MySQL临时表分为“内存临时表”和“磁盘临时表”,其中内存临时表使用MySQL的M...

1只特立独行的猪
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部