Textview增加图片并实现点击与文字设置不同大小颜色

来源:互联网 发布:nginx服务启动 编辑:程序博客网 时间:2024/06/05 04:05

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

需求再操蛋也是木有办法   

本文代码 textView 包含3个功能   1、文字中添加表情   2、文字中添加图片并实现点击3、同一个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);




0 0
原创粉丝点击