Android 動態圖文混排的經常使用方法

DrawableIcon的設置

對於TextView或者EditText動態設置drawableLeft,drawableRight,drawableTop,drawableBottom,drawableStart,drawableEnd的方法總結html

Android中提供了許多動態設置的方法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);

或者咱們可使用另一些方法ide

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

TextPaint+Html實現TextView圖文混排

使用SpannableString

實現URL的自動匹配:spa

URLSpan能夠自行匹配,Image須要使用到Html,這基本解決了80%的開發需求.net

 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

相關文章
相關標籤/搜索