天天看點

Textview增加圖檔并實作點選與文字設定不同大小顔色

本文參考   http://www.cnblogs.com/luction/p/3645210.html

需求再操蛋也是木有辦法   

本文代碼 textView 包含3個功能   1、文字中添加表情   2、文字中添加圖檔并實作點選3、同一個textView中的文字設定不同的字型大小與顔色

效果如圖

Textview增加圖檔并實作點選與文字設定不同大小顔色
Textview增加圖檔并實作點選與文字設定不同大小顔色
Textview增加圖檔并實作點選與文字設定不同大小顔色
Textview增加圖檔并實作點選與文字設定不同大小顔色

一切都在代碼裡     上代碼 

public class MainActivity extends Activity implements OnClickListener {

private TextView tv;

private Map<String, Integer> imageMap = new LinkedHashMap<String, Integer>();

private List<String> imageKeys;

private int TEXT_INDEX = 1;

private Button button1,button2,button3;

private ClickableImageSpan clickableImageSpan;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initData();

initView();

}

private void initView() {

tv = (TextView) findViewById(R.id.tv1);

button1 = (Button) findViewById(R.id.button1);

button2 = (Button) findViewById(R.id.button2);

button3 = (Button) findViewById(R.id.button3);

button1.setOnClickListener(this);

button2.setOnClickListener(this);

button3.setOnClickListener(this);

formatMatter();

}

private void initData() {

imageMap.put("[陰險]", R.drawable.f041);

imageMap.put("[取消]", R.drawable.remember_un);

imageMap.put("[點選]", R.drawable.remember_n);

Set<String> keySet = imageMap.keySet();

imageKeys = new ArrayList<String>();

imageKeys.addAll(keySet);

}

private void formatMatter(){

String showText = getResources().getString(R.string.survey_ba);

tv.setText(showText);

if(TEXT_INDEX == 3){

SpannableString spannableString = new SpannableString(showText);

spannableString.setSpan(new TextAppearanceSpan(MainActivity.this, R.style.text_style), 0, 6, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

tv.setText(spannableString);

}else{

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), (Integer) imageMap.values().toArray()[TEXT_INDEX]);

if(bitmap != null){

int rawHeigh = bitmap.getHeight();

int rawWidth = bitmap.getHeight();

int newHeight = 100;

int newWidth = 100;

float heightScale = ((float) newHeight) / rawHeigh;

float widthScale = ((float) newWidth) / rawWidth;

// 建立立矩陣

Matrix matrix = new Matrix();

matrix.postScale(heightScale, widthScale);

// 設定圖檔的旋轉角度

// matrix.postRotate(-30);

// 設定圖檔的傾斜

// matrix.postSkew(0.1f, 0.1f);

// 将圖檔大小壓縮

// 壓縮後圖檔的寬和高以及kB大小均會變化

Bitmap newBitmap = Bitmap.createBitmap(bitmap, 0, 0, rawWidth, rawHeigh, matrix, true);

ImageSpan imageSpan = new ImageSpan(MainActivity.this, newBitmap);

String emojiStr = imageKeys.get(TEXT_INDEX);

SpannableString spannableString = new SpannableString(emojiStr);

clickableImageSpan = new ClickableImageSpan(newBitmap) {

@Override

public void onClick(View view) {

if(TEXT_INDEX == 1){

TEXT_INDEX = 2;

}else{

TEXT_INDEX = 1;

}

formatMatter();

//Toast.makeText(MainActivity.this, "點選了", 2000).show();

}

};

if(TEXT_INDEX == 0){

spannableString.setSpan(imageSpan, emojiStr.indexOf('['), emojiStr.indexOf(']') + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

}else{

tv.setMovementMethod(ClickableMovementMethod.getInstance());

spannableString.setSpan(clickableImageSpan, emojiStr.indexOf('['), emojiStr.indexOf(']') + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

}

tv.append(spannableString);

}else{

int index = tv.getSelectionStart();

StringBuilder stringBuilder = new StringBuilder(showText);

stringBuilder.insert(index, imageKeys.get(TEXT_INDEX));

tv.setText(stringBuilder.toString());

//如果是為ed   則增加下行代碼

//setSelection(index + imageKeys.get(TEXT_INDEX).length());

}

}

}

@Override

public void onClick(View v) {

switch (v.getId()) {

//靜态表情

case R.id.button1:

TEXT_INDEX = 0;

formatMatter();

break;

//單選按鈕

case R.id.button2:

TEXT_INDEX = 1;

formatMatter();

break;

//文字标題突出

case R.id.button3:

TEXT_INDEX = 3;

formatMatter();

break;

default:

break;

}

}

}

//------------------------------------------------------------------------------------------------------------分割

ClickableImageSpan類代碼

public abstract class ClickableImageSpan extends ImageSpan{

public ClickableImageSpan(Drawable d) {

super(d);

}

@SuppressWarnings("deprecation")

public ClickableImageSpan(Bitmap b) {

super(b);

}

public abstract void onClick(View view);

}

//------------------------------------------------------------------------------------------------------------分割

ClickableMovementMethod類代碼

public class ClickableMovementMethod extends LinkMovementMethod {

    private static ClickableMovementMethod sInstance;

    public static ClickableMovementMethod getInstance() {

        if (sInstance == null) {

            sInstance = new ClickableMovementMethod();

        }

        return sInstance;

    }

    public boolean onTouchEvent(TextView widget, Spannable buffer,

                                MotionEvent event) {

        int action = event.getAction();

        if (action == MotionEvent.ACTION_UP ||

                action == MotionEvent.ACTION_DOWN) {

            int x = (int) event.getX();

            int y = (int) event.getY();

            x -= widget.getTotalPaddingLeft();

            y -= widget.getTotalPaddingTop();

            x += widget.getScrollX();

            y += widget.getScrollY();

            Layout layout = widget.getLayout();

            int line = layout.getLineForVertical(y);

            int off = layout.getOffsetForHorizontal(line, x);

            ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);

            ClickableImageSpan[] imageSpans = buffer.getSpans(off, off, ClickableImageSpan.class);

            if (link.length != 0) {

                if (action == MotionEvent.ACTION_UP) {

                    link[0].onClick(widget);

                } else if (action == MotionEvent.ACTION_DOWN) {

                    Selection.setSelection(buffer,

                            buffer.getSpanStart(link[0]),

                            buffer.getSpanEnd(link[0]));

                }

                return true;

            } else if (imageSpans.length != 0) {

                if (action == MotionEvent.ACTION_UP) {

                    imageSpans[0].onClick(widget);

                } else if (action == MotionEvent.ACTION_DOWN) {

                    Selection.setSelection(buffer,

                            buffer.getSpanStart(imageSpans[0]),

                            buffer.getSpanEnd(imageSpans[0]));

                }

                return true;

            } else {

                Selection.removeSelection(buffer);

            }

        }

        return false;

    }

}

以上2個類   在文章開頭  http://www.cnblogs.com/luction/p/3645210.html 解釋的很清楚,在這裡我就不多描述了

最後附帶上SpannableString 對象  常用的一些功能

設定超連結      
sp.setSpan(new URLSpan(“http://baidu.com”), 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);      
//設定下劃線
sp.setSpan(new UnderlineSpan(), 6, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);