1. 程式人生 > >editText裡面圖和文字混排並編輯以後存裡面的文字和圖片資訊等

editText裡面圖和文字混排並編輯以後存裡面的文字和圖片資訊等

package com.liu.demo;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.Editable;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.BackgroundColorSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.ImageSpan;
import android.text.style.StrikethroughSpan;
import android.text.style.StyleSpan;
import android.text.style.URLSpan;
import android.text.style.UnderlineSpan;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;




public class SpannableStringActivity extends Activity implements
OnClickListener {




private EditText tv;
private Button underline_btn;
private Button strike_btn;
private Button style_btn;
private Button font_btn;
private Button color_btn1;
private Button color_btn2;
private Button url_btn;
private Button image_btn;




/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);




    tv = (EditText) this.findViewById(R.id.tv);
    underline_btn = (Button) this.findViewById(R.id.underline_btn);
    strike_btn = (Button) this.findViewById(R.id.strike_btn);
    style_btn = (Button) this.findViewById(R.id.style_btn);
    font_btn = (Button) this.findViewById(R.id.font_btn);
    color_btn1 = (Button) this.findViewById(R.id.color_btn1);
    color_btn2 = (Button) this.findViewById(R.id.color_btn2);
    url_btn = (Button) this.findViewById(R.id.url_btn);
    image_btn = (Button) this.findViewById(R.id.image_btn);
    insertEditText("中國人民共和國");


    underline_btn.setOnClickListener(this);
    strike_btn.setOnClickListener(this);
    style_btn.setOnClickListener(this);
    font_btn.setOnClickListener(this);
    color_btn1.setOnClickListener(this);
    color_btn2.setOnClickListener(this);
    url_btn.setOnClickListener(this);
    image_btn.setOnClickListener(this);
}
//可通過Paint的measureText方法測量出文字所佔的實際長度
//下面是生成圖片的程式碼,最終生成的是橢圓形的圖片,裡面嵌套了文字
public static Bitmap createBitmap(Context context,String str){
    int h = sp2px(context, 16);
    Paint paint = new Paint();
    paint.setTextSize(h);
    int w = (int) paint.measureText(str);//計算文字實際佔用的寬度
    int height = 10+h;//將高度+10防止繪製橢圓時左右的文字超出橢圓範圍
    Bitmap bm = Bitmap.createBitmap(w+20, height, Config.ARGB_4444);
    Canvas c = new Canvas(bm);


     Paint p2 = new Paint();
     RectF re = new RectF(5, 0, w+15, height);//矩形
     float roundPx = 14;
     p2.setAntiAlias(true);//設定Paint為無鋸齒
     c.drawARGB(0, 0, 0, 0);// 透明色 
     p2.setColor(context.getResources().getColor(R.color.bg_color));
      c.drawRoundRect(re, roundPx, roundPx, p2);//繪製圓角矩形


    Paint p1 = new Paint();
    p1.setColor(Color.BLACK);
    p1.setTextSize(sp2px(context, 16));


    c.drawText(str, 10, 20, p1);
    c.save(Canvas.ALL_SAVE_FLAG);
    c.restore();
    return bm;
}
/** 
 * 將sp值轉換為px值,保證文字大小不變 
 *  
 * @param spValue 
 * @param fontScale 
 *            (DisplayMetrics類中屬性scaledDensity) 
 * @return 
 */  
public static int sp2px(Context context, float spValue) {  
    final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;  
    return (int) (spValue * fontScale + 0.5f);  
}
private void insertEditText(String str) {
    Bitmap bm = createBitmap(this, str);
    if (bm != null) {
        ImageSpan imageSpan = new ImageSpan(this, bm);
        SpannableString spannableString = new SpannableString("[name]"
                + str + "[/name]");
        spannableString.setSpan(imageSpan, 0,
                ("[name]" + str + "[/name]").length(),
                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        int index = tv.getSelectionStart();
        Editable editable = tv.getEditableText();
        if (index < 0 || index >= editable.length()) {
            editable.append(spannableString);
        } else {
            editable.insert(editable.length(), spannableString);
        }
    }
}
@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.underline_btn:
        addUnderLineSpan();
        break;
    case R.id.strike_btn:
        addStrikeSpan();
        break;
    case R.id.style_btn:
        addStyleSpan();
        break;
    case R.id.font_btn:
        addFontSpan();
        break;
    case R.id.color_btn1:
        addForeColorSpan();
        break;
    case R.id.color_btn2:
        addBackColorSpan();
        break;
    case R.id.url_btn:
        addUrlSpan();
        break;
    case R.id.image_btn:
       // addImageSpan();
    setFace("我的圖片",R.drawable.ic_launcher);
   
        break;
    }


}
//第一個引數 是圖片要的名稱,可以自己取   第二個引數就是 圖片資源ID 
private void setFace(String faceTitle, int faceImg) {
int start = tv.getSelectionStart();


Spannable ss = tv.getText().insert(start, "[" + faceTitle + "]");
Drawable d = getResources().getDrawable(faceImg);
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); 
ImageSpan span = new ImageSpan(d, faceTitle + ".gif", ImageSpan.ALIGN_BASELINE); 


ss.setSpan(span, start, start + ("[" + faceTitle + "]").length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}




/**
* 圖片
*/
private void addImageSpan() {
  SpannableString spanString = new SpannableString(" ");
  Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
  d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
  ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
  spanString.setSpan(span, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  tv.append(spanString);
  System.out.println("onclick 圖片:"+tv.getText().toString());
}


/**
* 超連結
*/
private void addUrlSpan() {
    SpannableString spanString = new SpannableString("超連結");
    URLSpan span = new URLSpan("tel:0123456789");
    spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    tv.append(spanString);
    System.out.println("onclick 超連結:"+tv.getText().toString());
}




/**
* 文字背景顏色
*/
private void addBackColorSpan() {
SpannableString spanString = new SpannableString("顏色2");
BackgroundColorSpan span = new BackgroundColorSpan(Color.YELLOW);
 spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
 tv.append(spanString);
 System.out.println("onclick 文字背景顏色:"+tv.getText().toString());
}




/**
* 文字顏色
*/
private void addForeColorSpan() {
    SpannableString spanString = new SpannableString("顏色1");
    ForegroundColorSpan span = new ForegroundColorSpan(Color.BLUE);
    spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    tv.append(spanString);
    System.out.println("onclick 文字背景顏色:"+tv.getText().toString());
}




/**
* 字型大小
*/
private void addFontSpan() {
    SpannableString spanString = new SpannableString("36號字型");
    AbsoluteSizeSpan span = new AbsoluteSizeSpan(36);
    spanString.setSpan(span, 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    tv.append(spanString);
    System.out.println("onclick 字型大小:"+tv.getText().toString());
}




/**
* 粗體,斜體
*/
private void addStyleSpan() {
    SpannableString spanString = new SpannableString("BIBI");
    StyleSpan span = new StyleSpan(Typeface.BOLD_ITALIC);
    spanString.setSpan(span, 0, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    tv.append(spanString);
    System.out.println("onclick 粗體,斜體:"+tv.getText().toString());
}




/**
* 刪除線
*/
private void addStrikeSpan() {
    SpannableString spanString = new SpannableString("刪除線");
    StrikethroughSpan span = new StrikethroughSpan();
    spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    tv.append(spanString);
    System.out.println("onclick 刪除線:"+tv.getText().toString());
}


/**
* 下劃線
*/
private void addUnderLineSpan() {
    SpannableString spanString = new SpannableString("下劃線");
    UnderlineSpan span = new UnderlineSpan();
    spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    tv.append(spanString);
    System.out.println("onclick 下劃線:"+tv.getText().toString());
}


}

相關推薦

editText裡面文字編輯以後裡面文字圖片資訊

package com.liu.demo; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; i

android實現gif文字

public class AnimatedImageSpan extends DynamicDrawableSpan { private Drawable mDrawable; public AnimatedImageSpan(Drawable d) { super();

checkbox與文字無法對齊到一行的解決辦法

內容 cal 無法 inpu div 解決 一行 name align 直接上代碼: <span><input style="vertical-align:middle" type="checkbox" name="checkbox" /><

相簿選取圖片插入到EditText中,實現圖文

1.首先用到了 ImagePicker,上github搜尋仿微信圖片選擇就能找到 2.匯入ImagePicker的包 compile 'com.squareup.picasso:picasso:2.5.2' 3.我是用是 picasso載入圖片,github上imag

iOS 上利用 fallback 機制為不同語言的文字 (script) 設定字型,從而使得文字更為優雅

如果您是一位 WEB 開發者,相信您對 CSS 的 font-family 屬性一定不會陌生。通常我們會為 font-family 屬性設定一長串的字型(家族)列表,就像這樣的: .text { font-family: Menlo, Monaco, Consolas, "Courier

使用RecyclerView實現GridViewListView的效果

   單位在做股票相關的app,美工切出一個圖,是一個GridView和ListView混排的效果圖,而且在滾動的時候,還要實現相關類別名有推動的效果,如下圖:        錄製的效果不是很好,因為csdn只能上傳2M,所以點選的效果沒有實現。下面會下載的地址。可以下載看

WPF仿QQ聊天框表情文字實現

二話不說。先上圖 圖中分別有檔案、文字+表情、純文字的展示,對於同一個list不同的展示形式,很明顯,應該用多個DataTemplate,那麼也就需要DataTemplateSelector了: class MessageDataTemplateSe

ReactNative系列之十九表情emoji與文字的兩種方案實現

方案一:使用react-native-emoji這個庫優點:文字和圖片混排單行多行,居中顯示都正常缺點:依賴手機的環境,只能根據系統裡的表情進行顯示?不能自定義表情。。。emoji...這種方案基本不可行,使用者體驗差方案二:<Text>    <Text&

react native 實現動態高度Listview 圖文

當考慮這個動態高度和圖文混排的問題,想必你已經知道如何載入ListView和分組listview,這裡不再贅述... 這裡簡介實現的動態的高度的cell的思路 寫一個ListView,準好資料來源在renderRow中渲染自定義的item在item 中佈局text 和ima

html佈局之 圖示文字

  摘要:做html佈局的時候經常用到圖示和文字的混排,使用的時候經常要調很長時間,今天來總結一下。 直接上程式碼: <!doctype html> <html class="

a=[12,34,56],用程式碼求出a裡面三個數字組合,求出組合裡面的最大數,如可以組成123456,125634,563412,561234,341256,345612。

這個題目主要用到迴圈、字串拼接和排序,程式碼如下: a = [12,34,56] d = []  #儲存新的list for i in a:   for j in a:     for k in a:       if (i != j) and (j != k) and (i != k)

List集合儲存字串自定義物件遍歷(for迴圈迭代)

package list; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * :List集合儲存字串並遍歷?(迭代器和普通for)

Android TextView圖文,圖片文字居中對齊

TextView用來顯示文字是最普通的用法了,有些情況需要我們再文字中顯示圖片,比如顯示錶情,下邊來說說處理方法. 1.下圖是專案中一個UI需求 如圖需要在文字的前邊顯示新上標籤,開始的處理方法是用了兩個空間分別顯示標籤和文字,但是有個問題是第二行的文字

Android 解決圖文圖片文字居中對齊問題(ImageSpan)

一. 概述 眾所周知,Android圖文混排可以通過SpannableString來實現,通過在相應位置使用ImageSpan替換即可,但是使用過的人會發現,imageSpan只提供了兩種對齊方式,如下所示: /** 底部對齊

CSS佈局之圖文,影象簽名,多拼接圖片特效

    <divid="text">       高圓圓,中國女演員,1979年10月5日出生於北京市豐臺區雲崗一個普通的知識分子家庭。1996年高圓圓被廣告公司發掘,隨後拍攝了大量廣告,成為了廣告圈中的模特。1997年高圓圓出演了她的第一部電影《愛情麻辣燙》,從此開始了她的演員生涯。2001年高

Android 文字圖片文字環繞圖片

在平時我們做專案中,或許有要對一張圖片或者某一個東西進行文字和圖片說明,這時候要求排版美觀,所以會出現文字和圖片混排的情況,如圖: 這種情況就是上下兩個文字說明是連續在一起的,這就要求我們計算上面的文字說明怎麼和下面的文字說明連貫結合在一起呢,這就要求我們進行計算了,下

Android圖文-實現EditText圖文混合插入上傳

origin uri keyword src llb fail ren -a amp 前段時間做了一個Android會議管理系統,項目需求涉及到EditText的圖文混排,如圖: 在上圖的”會議詳情”中。須要支持文本和圖片的混合插入,下圖演示輸入的

視訊

最近在做一個功能,就是廣告頁面的圖片視訊混合播放,一切的資料來源都是取自伺服器,並沒有規定第幾個放視訊,第幾個放圖片,先說一下實現的大體思路,首先,播放圖片我們常用的是ImageView,網路圖片則會選擇ImageLoader框架,而播放視訊由於筆者水平有限,所以只是選擇了Android原生的Vid

keras 處理文字,分類,數值資料,新增進網路的步驟方法

一,讀取資料: 主要使用pandas 讀取,以後考慮使用其他方法(libsvm等) 二,獲取訓練集和測試集: 這一步主要是劃分資料集,drop()掉訓練集裡的預測那一列 三,處理缺失值: 可以使用fillna(value,inplace)來把缺失值補全 四:送入網

RichEditeText——android圖文文字文章編輯器實現詳解

需求:android 實現富文字編輯器,並且實現html解析和生成。 功能點: 字型加粗,斜體,下劃線,刪除線 字型設定大小   預設大(18px),中(16px),小(14px) 字型設定顏色 換行插入圖片 編輯內容生成html 解析html並且顯示 主要實現