Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 国产小视频在线看,免费伦费一区二区三区四区,国产超a特工片免费完整版电影

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          Flutter中富文件標(biāo)簽的解決方案

          Flutter中富文件標(biāo)簽的解決方案


          —— 執(zhí)劍天涯,從你的點(diǎn)滴積累開始,所及之處,必精益求精。


          在實(shí)際業(yè)務(wù)開發(fā)中,時(shí)常會(huì)有這種一段Html格式的標(biāo)簽,看下圖的情況 :


          在 Flutter 中,有點(diǎn)發(fā)愁,因?yàn)?Flutter 提供的 Text 與 RichText 還解析不了這種格式的,但是你也不能使用 WebView 插件,如果使用了,你會(huì)在每一個(gè)Item中嵌入一個(gè)瀏覽器內(nèi)核,再?gòu)?qiáng)的手機(jī),也會(huì)卡,當(dāng)然肯定不能這樣做,因?yàn)檫@樣就是錯(cuò)誤的做法。

          小編經(jīng)過(guò)大量的嘗試與思考,終于寫出來(lái)了一個(gè)插件可以來(lái)解析了,現(xiàn)分享給大家。

          1 基本使用實(shí)現(xiàn)

          1.2 添加依賴

          小編依舊,來(lái)個(gè)pub方式:

          dependencies:
            flutter_html_rich_text: ^1.0.0
          

          1.3 加載解析 HTML 片段標(biāo)簽

          核心方法如下:

          ///htmlText 就是你的 HTML 片段了
           HtmlRichText(
            htmlText: txt,
           ),

          如下代碼清單 1-3-1 就是上述圖中的效果:

          /// 代碼清單 1-3-1
          class TestHtmlPage extends StatefulWidget {
            @override
            _TestPageState createState()=> _TestPageState();
          }
          
          class _TestPageState extends State<TestHtmlPage> {
          
            String txt="<p>長(zhǎng)途輪 <h4>高速驅(qū)動(dòng)</h4><span style='background-color:#ff3333'>"
                "<span style='color:#ffffff;padding:10px'> 3條立減 購(gòu)胎抽獎(jiǎng)</span></span></p>"
                "<p>長(zhǎng)途高速驅(qū)動(dòng)輪<span ><span style='color:#cc00ff;'> 3條立減 購(gòu)胎抽獎(jiǎng)</span></span></p>";
          
            @override
            Widget build(BuildContext context) {
              return Scaffold(
                ///一個(gè)標(biāo)題
                appBar: AppBar(title: Text('A頁(yè)面'),),
                body: Center(
                  ///一個(gè)列表
                  child: ListView.builder(
                    itemBuilder: (BuildContext context, int postiont) {
                      return buildItemWidget(postiont);
                    },
                    itemCount: 100,
                  ),
                ),
              );
            }
          
            ///ListView的條目
            Widget buildItemWidget(int postiont) {
              return Container(
                ///內(nèi)容邊距
                padding: EdgeInsets.all(8),
                child: Column(
                  ///子Widget左對(duì)齊
                  crossAxisAlignment: CrossAxisAlignment.start,
          
                  ///內(nèi)容包裹
                  mainAxisSize: MainAxisSize.min,
                  children: [
                    Text(
                      "測(cè)試標(biāo)題 $postiont",
                      style: TextStyle(fontWeight: FontWeight.w500),
                    ),
          
                    ///html富文本標(biāo)簽
                    Container(
                      margin: EdgeInsets.only(top: 8),
                      child: HtmlRichText(
                        htmlText: txt,
                      ),
                    )
                  ],
                ),
              );
            }
          }
          

          以下是解析思考 燒腦的實(shí)踐


          2 燒腦思考實(shí)踐一

          Flutter 應(yīng)用程序被 Android iOS平臺(tái)加載,在原生 Android 中,使用TextView就可輕松實(shí)現(xiàn)解析(如下代碼清單2-1),當(dāng)然在iOS中使用UILabel也可輕松實(shí)現(xiàn)(如下代碼清單2-2)。

          // Android 原生 TextView加載Html的核心方法
          //代碼清單2-1
          // MxgsaTagHandler 定義的一個(gè) TagHandler 用來(lái)處理點(diǎn)擊事件
          lTextView.setText(Html.fromHtml(myContent, null, new MxgsaTagHandler(context)));
          lTextView.setClickable(true);
          lTextView.setMovementMethod(LinkMovementMethod.getInstance());
          

          iOS UILable

          // iOS 原生 UILabel加載Html的核心方法
          //代碼清單2-2
          //返回的HTML文本 如 <font color='red'></font>
          NSString *str=@"htmlText";
          NSString *HTMLString=[NSString stringWithFormat:@"<html><body>%@</body></html>", str ];
          
          
          NSDictionary *options=@{NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType,
                                    NSCharacterEncodingDocumentAttribute : @(NSUTF8StringEncoding)
                                    };
          NSData *data=[HTMLString dataUsingEncoding:NSUTF8StringEncoding];
          
          NSMutableAttributedString * attributedString=[[NSMutableAttributedString alloc] initWithData:data options:options documentAttributes:nil error:nil];
          
          NSMutableParagraphStyle *paragraphStyle=[[NSMutableParagraphStyle alloc] init];   // 調(diào)整行間距
          paragraphStyle.lineSpacing=8.0;
          paragraphStyle.alignment=NSTextAlignmentJustified;
          [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, attributedString.length)];
          
          [attributedString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:15] range:NSMakeRange(0, attributedString.length)];
          
          
          _uiLabel.backgroundColor=[UIColor cyanColor];
          _uiLabel.numberOfLines=0;
          _uiLabel.attributedText=attributedString;
          [_uiLabel sizeToFit];
          
          

          然后對(duì)于 Flutter 來(lái)講是可以順利的加載原生 View的 ,如下代碼清單 2-3所示就是在Flutter中通過(guò) AndroidView 與 UiKitView來(lái)實(shí)現(xiàn)。

            //Flutter中加載原生View核心方法
            //代碼清單2-3
            buildAndroidView() {
              return AndroidView(
                //設(shè)置標(biāo)識(shí)
                viewType: "com.studyon./text_html",
                //參數(shù)的編碼方式
                creationParamsCodec: const StandardMessageCodec(),
              );
            }
          
            /// 通過(guò) UiKitView 來(lái)加載 iOS原生View
            buildUIKitView() {
              return UiKitView(
                //標(biāo)識(shí)
                viewType: "com.studyon./text_html",
                //參數(shù)的編碼方式
                creationParamsCodec: const StandardMessageCodec(),
              );
            }
          



          于是小編開發(fā)了第一波操作,開發(fā)了這樣的一個(gè)插件來(lái)調(diào)用原生 View 實(shí)現(xiàn)渲染富文本標(biāo)簽,這個(gè)插件使用方式很簡(jiǎn)單,如下所示:

          HTMLTextWidet(
            htmlText: "測(cè)試一下",
           )

          這一步操作真是所謂的騷操作,其實(shí)小編在開發(fā)前就覺得不太合適,不過(guò)以小編的個(gè)性,非得嘗試驗(yàn)證一下,現(xiàn)結(jié)果出來(lái)了,就是在加載時(shí),由于應(yīng)用在列表中,使用 HTMLTextWidet 會(huì)有短暫的黑屏效果,而且內(nèi)存出吃不消,如下圖所示:


          為什么會(huì)黑屏,閑魚技術(shù)團(tuán)隊(duì)有過(guò)論述在《Flutter中嵌入Native組件的正確姿勢(shì)》 以及 文章 《深入了解Flutter界面開發(fā)中有詳細(xì)論述》 。

          所以結(jié)果是 :不可行。


          3 燒腦思考實(shí)踐二

          用 Java 的思想來(lái)解析 String 的方式來(lái)處理 HTML 字符串,處理成小片段,然后使用Text結(jié)合 流式布局 Wrap 來(lái)組合,核心代碼如下清單 3-1 所示為解析:

          /*
             解析標(biāo)簽
             */
          List<TagColorModel> findBackGroundColor(String htmlStr) {
            List<TagColorModel> tagColorModelList=[];
            List<String> colorSpiltList=[];
            String driverAdvertisement=htmlStr;
            if (driverAdvertisement !=null) {
          
              colorSpiltList=driverAdvertisement.split("background-color");
          
              for (var i=0; i < colorSpiltList.length; i++) {
                TagColorModel itemColorModel=TagColorModel();
                String colorsStr=colorSpiltList[i];
                List<String> itemSpiltList=colorsStr.split(":#");
                for (var j=0; j < itemSpiltList.length; ++j) {
                  String item=itemSpiltList[j];
                  String itemColor="";
                  String itemText="";
                  try {
                    if (item.length >=6) {
                      itemColor=item.toString().substring(0, 6);
                      if (itemColor.trim().toUpperCase()=="FFFFFF") {
                        itemColorModel.backGroundColor=ColorUtils.getRandomColor();
                      } else {
                        itemColorModel.backGroundColor=new Color(
                          int.parse(itemColor.trim(), radix: 16) + 0xFF000000);
                      }
                      int startIndex=item.indexOf("\">");
                      int endIndex=item.indexOf("</");
                      if (startIndex !=-1 && endIndex >=startIndex) {
                        LogUtil.e("startIndex  $startIndex  endIndex $endIndex ");
                        itemText=item.substring(startIndex + 2, endIndex);
                        LogUtil.e("itemColor  $itemColor  itemText $itemText ");
                        itemColorModel.text=itemText;
                        tagColorModelList.add(itemColorModel);
                      }
                    }
                  } catch (e) {
                    ///解析異常的 不必處理
                  }
                }
              }
            }
            LogUtil.e("${tagColorModelList.length} \n\n ");
            return tagColorModelList;
          }
          

          然后 TagColorModel 的定義如下代碼清單 3-2所示:

          ///代碼清單 3-2 
          class TagColorModel {
            ///背景
            Color backGroundColor;
           ///文本顏色
            Color textColor;
           ///文本
            String text;
          
            TagColorModel(
                {this.text="",
                this.backGroundColor=Colors.transparent,
                this.textColor=Colors.white});
          }

          然后就是使用 Wrap 來(lái)使用解析的內(nèi)容,如下代碼清單3-3所示:

          ///代碼清單 3-3
          ///獲取背景顏色
            List<TagColorModel> colorList=findBackGroundColor(htmlStr);
          
            List<Widget> tagList=[];
          
            for (var i=0; i < colorList.length; ++i) {
              TagColorModel model=colorList[i];
          
              tagList.add(Container(
                margin: EdgeInsets.only(right: 2, left: 4, top: 4),
                padding: EdgeInsets.only(left: 6, right: 6),
                decoration: BoxDecoration(
                  color: model.backGroundColor,
                  borderRadius: BorderRadius.all(Radius.circular(2)),
                ),
                child: Text(
                  "${model.text}",
                  style: TextStyle(fontSize: 12, color: model.textColor),
                ),
              ));
            }
          
            ///然后再使用 Wrap 包裹
            Wrap(
          	alignment: WrapAlignment.spaceBetween,
           	 children: tagList,
            ),
          

          實(shí)踐結(jié)果:可行,但是有兼容性差,效率低。

          當(dāng)然閑魚團(tuán)隊(duì)在文章《如何低成本實(shí)現(xiàn)Flutter富文本,看這一篇就夠了!》 中也有詳細(xì)論述過(guò),與上述的思路差不多。

          4 燒腦思考實(shí)踐三

          當(dāng)在Flutter中 Dart 從網(wǎng)站中提取數(shù)據(jù)時(shí),html依賴庫(kù)是一個(gè)不錯(cuò)的選擇,html 是一個(gè)開源的 Dart 包,主要用于從 HTML 中提取數(shù)據(jù),從中獲取節(jié)點(diǎn)的屬性、文本和 HTML以及各種節(jié)點(diǎn)的內(nèi)容。

          
          dependencies:
            html: ^0.14.0+3
          

          于是乎小編也開始嘗試,首先是使用 Html 庫(kù)解析 HTML文本塊,將解析的 Document 通過(guò)遞歸方式遍歷出來(lái)所有的 node 節(jié)點(diǎn),如下代碼清單4-1所示:

          代碼清單4-1
          import 'package:html/parser.dart' as parser;
          import 'package:html/dom.dart' as dom;
          
          List<Widget> parse(String originHtmlString) {
            // 空格替換 去除所有 br 標(biāo)簽用 \n 代替,
            originHtmlString=originHtmlString.replaceAll('<br/>', '\n');
            originHtmlString=originHtmlString.replaceAll('<br>', '\n');
            originHtmlString=originHtmlString.replaceAll('<br />', '\n');
          
            ///html 依賴庫(kù)解析
            dom.Document document=parser.parse(originHtmlString);
            ///獲取 DOM 中的 node 節(jié)點(diǎn)
            dom.Node cloneNode=document.body.clone(true);
          
           // 注意: 先序遍歷找到所有關(guān)鍵節(jié)點(diǎn)(由于是引用傳值,所以需要重新獲取一遍 hashCode)
            List<dom.Node> keyNodeList=new List<dom.Node>();
            int nodeIndex=0;
            ///遞歸遍歷
            parseNodesTree(cloneNode, callBack: (dom.Node childNode) {
              if (childNode is dom.Element &&
                  truncateTagList.indexOf(childNode.localName) !=-1) {
                print('TEST: truncate tag nodeIndex=${nodeIndex++}');
                keyNodeList.add(childNode);
                // 注意: 對(duì)于占據(jù)整行的圖片也作為關(guān)鍵節(jié)點(diǎn)處理
              } else if (childNode is dom.Element &&
                  childNode.localName=='img' &&
                  checkImageNeedNewLine(childNode)) {
                print('TEST: one line image nodeIndex=${nodeIndex++}');
                keyNodeList.add(childNode);
              }
            });
          
          }
          
          ///遞歸遍歷
          void parseNodesTree(dom.Node node,
              {NodeTreeCallBack callBack=printNodeName}) {
            ///遍歷 Node 節(jié)點(diǎn)
            for (var i=0; i < node.nodes.length; ++i) {
              dom.Node item=node.nodes[i];
              callBack(item);
              parseNodesTree(item, callBack: callBack);
            }
          }
          

          然后就是將 得出的 node 節(jié)點(diǎn) 與 Flutter 組件映射,文本使用 TextSpan ,圖片使用 Image ,然后將 樣式使用 TextStyle 映射,然后最后將解析的結(jié)果組件使用 Wrap 來(lái)包裹,就達(dá)到了現(xiàn)在的插件 flutter_html_rich_text 。


          綜合實(shí)現(xiàn)思路就是 使用 HTML 庫(kù)完善了【燒腦思考實(shí)踐二】中的解析。

          解析篇幅較長(zhǎng),大家有興趣可以看下 github 源碼。



          完畢

          者博客

          http://www.jianshu.com/u/0fa6f5d09040

          文章目錄

          • 前言

          • 場(chǎng)景

          • 實(shí)現(xiàn)方式

          • drawable屬性

          • Spannable使用

          • HTML顯示

          • 總結(jié)


          0

          前言

          在使用TextView的時(shí)候,我們經(jīng)常需要在TextView中進(jìn)行圖文混排,比如在QQ中聊天的消息中的表情,底部tab圖標(biāo)等。

          1

          場(chǎng)景

          2

          實(shí)現(xiàn)方式

          Android官方對(duì)TextView的圖文混排提供了支持,我們可以從以下三種方式實(shí)現(xiàn)TextView的圖文混排:

          1.在TextView中使用Compound Drawable屬性;

          2.在TextView中使用Spannable多樣式顯示;

          3.在TextView中顯示HTML文本。

          3

          drawable屬性

          在TextView中使用Compound Drawable屬性可以在文字的上下左右放置drawable,效果如下:

          一共有兩種方式可以實(shí)現(xiàn):XML布局設(shè)置和Java代碼設(shè)置。

          1. xml布局

          2. java代碼

          注意:必須setBounds測(cè)量圖片邊界,否則不顯示。

          3.缺陷

          當(dāng)TextView設(shè)置成固定大小時(shí),由于文字距離邊界的距離過(guò)大,會(huì)導(dǎo)致文字與圖片之間設(shè)置的間距無(wú)效,如下圖。

          解決方案:

          ①設(shè)置TextView的內(nèi)填充

          通過(guò)設(shè)置paddingLeft、paddingRight、paddingTop、paddingBottom來(lái)縮寫這個(gè)間距

          ②自定義TextView重新布局

          a.先自定義屬性iconPadding來(lái)設(shè)置間距,并提供方法給外部調(diào)用。

          b.重寫setCompoundDrawablesWithIntrinsicBounds方法來(lái)獲取我們?cè)O(shè)置的drawable寬高。

          c.最后重寫onLayout方法。

          可以先參考:Android技巧之drawablePadding的那些事(https://yuxingxin.com/2015/11/05/DrawablePadding/),該篇文章只解決了左右失效的問(wèn)題。后期會(huì)整理個(gè)解決圖文混排的工具庫(kù),里面會(huì)有具體方案。

          4

          Spannable使用

          1.簡(jiǎn)介

          setText(CharSequence text)中接收的是CharSequence。而SpannableString和SpannableStringBuilder是其實(shí)現(xiàn)類,是可以直接賦值的。并且兩者的setSpan方法可以設(shè)置一些格式對(duì)象(例如字體大小、下劃線、替換為圖片等),這就可以實(shí)現(xiàn)富文本了。

          Spannable實(shí)現(xiàn)子類:SpannableString,SpannableStringBuilder(可變,類似于StringBuilder)。

          Spannable中定義了抽象方法:setSpan(Object what, int start, int end, int flags)和removeSpan(Object what)。這兩個(gè)方法實(shí)現(xiàn)了對(duì)字符串的靈活編輯。

          其中setSpan方法包含如下參數(shù):

          flags常用的有四種

          通常在insert方式才生效,平時(shí)不生效,具體看:Explain the meaning of Span flags like SPAN_EXCLUSIVE_EXCLUSIVE。(https://stackoverflow.com/questions/9879233/explain-the-meaning-of-span-flags-like-span-exclusive-exclusive)

          2.常用span類

          3.使用方式

          其中ImageSpan默認(rèn)對(duì)其方式有兩種:ALIGN_BOTTOM及ALIGN_BASELINE。很可惜我們平常用的居中對(duì)其的方式?jīng)]有,不過(guò)可以通過(guò)自定義實(shí)現(xiàn),后續(xù)會(huì)在開源出來(lái)。

          4.效果

          5

          HTML顯示

          一般顯示HTML內(nèi)容有兩種方式:

          • 使用 Android 提供的 WebView 控件。


          • 通過(guò)將 HTML 內(nèi)容轉(zhuǎn)化為 Spanned 格式在 TextView 中進(jìn)行顯示。

          現(xiàn)在大多數(shù)都用WebView的方式。但是并不是所有的場(chǎng)景下都適合使用 WebView 來(lái)顯示 HTML 內(nèi)容,例如,如果應(yīng)用要顯示的內(nèi)容只是一部分 HTML 片段,就可以利用 TextView 來(lái)進(jìn)行顯示,并且效率較高。

          由于這種方式不太常用,就不深入介紹,里面可以實(shí)現(xiàn)的效果還是很好的。

          1.簡(jiǎn)介

          Android 中的 TextView 組件常用于顯示文本內(nèi)容,其實(shí)它也可以顯示 HTML 的內(nèi)容。

          簡(jiǎn)單來(lái)講,這就需要先把 HTML 的內(nèi)容以字符串的形式獲取后,經(jīng)過(guò) android.text.Html.fromHtml轉(zhuǎn)化成 Spanned 的格式,然后將其傳遞到 TextView 的 setText方法中,這樣就可以在 TextView 中顯示 HTML 頁(yè)面的內(nèi)容了。

          需要注意的是,并不是所有的 HTML 標(biāo)簽在 TextView 中都是支持的,且官方文檔并沒有明確的說(shuō)明支持 HTML 標(biāo)簽列表,通過(guò)查看 Android 源代碼,可以得到簡(jiǎn)單的支持列表。

          下面的示例來(lái)介紹如何在 TextView 中顯示一段 HTML 內(nèi)容,要顯示的這段 HTML 內(nèi)容即包含超鏈接內(nèi)容,也包含有圖片。

          2.使用

          fromHtml方法

          source,就是包含 HTML 內(nèi)容的字符串。Html.ImageGetter 和 Html.TagHandler 是兩個(gè)接口,提供給開發(fā)者繼承使用。

          imageGetter, 如果要顯示圖片是需要被繼承的,重寫 getDrawable(String source)方法,用于獲取 HTML 里面的圖片來(lái)顯示在 TextView 中。

          tagHandler,其作用是把 HTML 帶標(biāo)記的文本內(nèi)容字符串轉(zhuǎn)化成可以顯示效果的的 Spanned 字符串 。由于并非所有的 HTML 標(biāo)簽都可以轉(zhuǎn)化,所以在使用時(shí),用戶需要自己添加一些必要的標(biāo)簽和處理方法時(shí)才會(huì)繼承使用的。

          繼承ImageGetter

          繼承于 ImageGetter,重寫 getDrawable (String source) 方法。通過(guò)異步操作,讀取本地/網(wǎng)絡(luò)資源,獲得drawable對(duì)象。

          繼承TagHandler

          繼承于 TagHandler,重寫了 handleTag方法。為了支持更多的標(biāo)簽,例如為了支持<ul><ol><dd>和<li>標(biāo)簽,這四個(gè)標(biāo)簽是在 formHtml方法中本身是不支持。

          如果開發(fā)者認(rèn)為安卓 TagHandler 提供的默認(rèn)標(biāo)簽解析已經(jīng)夠用,直接在 fromHtml方法中第三個(gè)參數(shù)的地方填寫 既可。

          最后,通過(guò) formHtml方法將 HTML 內(nèi)容轉(zhuǎn)化為可供顯示的 SpannableString,將 SpannableString 通過(guò) setText 方法放入 TextView 中,就可以顯示圖文并茂的內(nèi)容了。

          用戶交互

          formHtml方法已經(jīng)將 HTML 內(nèi)容中的超鏈接和圖片轉(zhuǎn)義成為 UrlSpan 和 ImageSpan,進(jìn)而在 TextView 中完成顯示。但是此時(shí)是沒有任何用戶交互的,用戶只能看到 HTML 的內(nèi)容,下面介紹如何添加用戶交互功能。

          要完成用戶交互,這里我們需要在 TextView 中還需要調(diào)用textView.setMovementMethod方法。

          Android 提供了 LinkMovementMethod 類以實(shí)現(xiàn)了對(duì)于文本內(nèi)容中超鏈接的遍歷,并且支持對(duì)于超鏈接的點(diǎn)擊事件。

          所以只要在添加下面一行代碼,就可以使點(diǎn)擊 UrlSpan 能夠觸發(fā)打開鏈接的功能。

          如果想要更多的用戶交互效果,可以自定義LinkMovementMethod 類,重寫onTouchEvent方法來(lái)實(shí)現(xiàn)。

          3.效果

          關(guān)于HTML顯示這部分,沒做具體實(shí)現(xiàn)。具體可以看:靈活高效的在 Android Native App 開發(fā)中顯示 HTML 內(nèi)容(https://www.ibm.com/developerworks/cn/web/1407_zhangqian_androidhtml/index.html),里面有具體源碼可以下載,HTML部分內(nèi)容也是參考該篇文章完成的。

          開源庫(kù):html-textview

          https://github.com/PrivacyApps/html-textview

          6

          總結(jié)

          以上就是關(guān)于圖文混排的一些解決方案,相信通過(guò)這些了解,對(duì)于工作中的實(shí)際場(chǎng)景的使用大家會(huì)有適當(dāng)?shù)慕鉀Q方案。由于實(shí)際應(yīng)用較少,所以認(rèn)識(shí)較為淺顯,可能有些地方描述不當(dāng),后期會(huì)考慮封裝個(gè)解決圖文混排的工具類,加深下理解。

          TextView添加背景,或者是給TextView添加添加邊框,以及怎么樣設(shè)置TextView的形狀。怎么在java代碼部分設(shè)置TextView的背景,和TextView的形狀及邊框。

          方法如下:

          怎么在Java代碼部分怎么設(shè)置TextView的背景顏色,其實(shí)很簡(jiǎn)單的就一句話。

          tvTemp.setBackgroundColor(Color.parseColor("#00FF00"));

          在xml布局文件中就可以直接調(diào)用drawable文件代碼如下:

          android:background="@drawable/textview"
          

          在設(shè)置背景的時(shí)候, 我們都知道使用 setBackgroundColor()方法,但是,方法里面的參數(shù),必須是RGB HTML格式的值,如果我們用drawable,它會(huì)提示drawable是int類型的。(其實(shí)如果可以的話我們不妨使用ImageView組件,這個(gè)組件相對(duì)TextView更好用)。

          接下來(lái)就來(lái)看看怎么給讓TextView顯示邊框,并且怎么樣讓其顯示圓形。這里我們就需要在drawable里面,新建一個(gè).xml文件。

          <?xml version="1.0" encoding="utf-8"?>
          <shape xmlns:android="http://schemas.android.com/apk/res/android"
           android:shape="oval"
           android:useLevel="false">
           <solid android:color="#00FF00" />
           <stroke android:width="1dip" android:color="#000000" />
           <size
            android:width="15dp"
            android:height="15dp" />
          </shape>

          這只是一個(gè)圓形,其中, stroke屬性,是設(shè)置的他的邊框顏色和寬度,在xml布局中顯示的是如圖所示的樣式:

          xml樣式

          可以在xml文件中利用drawable調(diào)用。其中在xml中不僅可以設(shè)置圓形,而且還可以設(shè)置圓角,

          <corners android:radius="15dp" />屬性就是設(shè)置圓角
          

          我們?cè)诮榻B一些關(guān)于shape里面的知識(shí):

          gradient -- 顏色漸變
          startcolor 起點(diǎn)顏色
          endcolor 終點(diǎn)顏色
          android:angle 角度 0是從左到右,90是從下到上
          solid -- 填充
          stroke -- 描邊
          corners -- 圓角
          padding -- 內(nèi)容離邊界的距離
          當(dāng)需要在java代碼中需要設(shè)置TextView時(shí),發(fā)現(xiàn)通過(guò)上面的方法設(shè)置,圓角就會(huì)消失,在這里怎么讓圓角不會(huì)消失,我們需要:


          主站蜘蛛池模板: 国产a久久精品一区二区三区| 国产精品一区二区毛卡片| 精品一区高潮喷吹在线播放| 国产成人精品一区二三区| 精品无码一区二区三区爱欲九九| 无码精品蜜桃一区二区三区WW| 亚洲一区二区观看播放| 久久婷婷色一区二区三区| 中文字幕一区二区三区精华液 | 国产精品无码一区二区三区免费| 亚洲第一区视频在线观看| 亚洲AV无码一区二区三区DV| 国产精品毛片一区二区三区| 三上悠亚日韩精品一区在线| 一区二区三区无码高清| 日本韩国黄色一区二区三区| 高清一区二区在线观看| 国产一区精品视频| 精品一区二区三区在线视频观看 | 亚洲av日韩综合一区在线观看| asmr国产一区在线| 午夜无码一区二区三区在线观看| 日韩三级一区二区三区| 国产综合视频在线观看一区| 亚洲精品色播一区二区| 精品欧洲AV无码一区二区男男| 精品福利一区二区三区免费视频 | 精品一区二区三区四区电影| 怡红院美国分院一区二区| 日韩在线视频一区二区三区| 高清一区二区在线观看| 色妞AV永久一区二区国产AV| 久久综合九九亚洲一区| 亚洲一区二区三区高清| 中日韩精品无码一区二区三区| 精品国产亚洲一区二区三区在线观看 | 精品一区二区三区在线成人| 日本不卡在线一区二区三区视频 | 国产精品一区12p| 久久久久无码国产精品一区 | 日本欧洲视频一区|