android 点击图片事件,android图文混排点击事件
圖文混排顧名思義就是把文字和圖片混合排列在一起,比較簡單的需求我們也可以通過TextView和ImageView配合使用來達到目的,但是遇到稍微復(fù)雜一些的情況這種方法就不適用了。
做這樣一個按鈕:
對于你來說沒有任何難度:LinearLayout+TextView+ImageView搞定;或者可以直接使用TextView的drawableLeft屬性。
這里記錄兩種復(fù)雜情況的處理方法:
為部分文字添加點擊事件;
圖文混排,圖片居中,圖片可點擊。
1. 為部分文字添加點擊事件
我最終實現(xiàn)的效果是這個樣子的:
可點擊文字顯示為特殊顏色,并可以點擊。個人覺得這個最大的特色就是可以像普通文本一樣換行,這是組合控件所不能實現(xiàn)的。
這里使用了SpannableString和ClickableSpan實現(xiàn),具體代碼如下:
ClickSpan繼承自ClickableSpan:
import android.text.TextPaint;
import android.text.style.ClickableSpan;
import android.view.View;
import com.travis.uqmei.utils.ToastUtil;
/**
* Created by travis on 16/9/18.
*/
public class ClickSpan extends ClickableSpan {
private String txt;
public ClickSpan(String txt){
this.txt = txt;
}
@Override
public void onClick(View widget) {
String content = String.format("ClickSpan is clicked, and txt is %s ",txt);
ToastUtil.show(content);
}
@Override
public void updateDrawState(TextPaint ds) {
//根據(jù)自己的需求定制文本的樣式
ds.setColor(ds.linkColor);
ds.setUnderlineText(false);
}
}
為TextView設(shè)置部分文字可點擊效果:
TextView tv = (TextView) findViewById(R.id.tv);
String from = "張全蛋";
String to = "趙鐵柱";
String txt = String.format("%s回復(fù)@%s:我是富士康3號流水線的張全蛋," +
"英文名叫Micheal Jack,發(fā)文名叫helodie Jaqueline。", from, to);
SpannableString span = new SpannableString(txt);
ClickSpan clickSpan = new ClickSpan(to);
span.setSpan(clickSpan, txt.indexOf(to),
txt.indexOf(to) + to.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(span);
tv.setMovementMethod(LinkMovementMethod
.getInstance());
2. 圖文混排,圖片居中,圖片可點擊
效果如下:
可點擊效果通過上述ClickSpan實現(xiàn),圖文混排通過VerticalImageSapn實現(xiàn)。
VerticalImageSpan繼承自ImageSpan:
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.text.style.ImageSpan;
/**
* 垂直居中的ImageSpan
*
* @author travis
*/
public class VerticalImageSpan extends ImageSpan {
public VerticalImageSpan(Drawable drawable) {
super(drawable);
}
public int getSize(Paint paint, CharSequence text, int start, int end,
Paint.FontMetricsInt fontMetricsInt) {
Drawable drawable = getDrawable();
Rect rect = drawable.getBounds();
if (fontMetricsInt != null) {
Paint.FontMetricsInt fmPaint = paint.getFontMetricsInt();
int fontHeight = fmPaint.bottom - fmPaint.top;
int drHeight = rect.bottom - rect.top;
int top = drHeight / 2 - fontHeight / 4;
int bottom = drHeight / 2 + fontHeight / 4;
fontMetricsInt.ascent = -bottom;
fontMetricsInt.top = -bottom;
fontMetricsInt.bottom = top;
fontMetricsInt.descent = top;
}
return rect.right;
}
@Override
public void draw(Canvas canvas, CharSequence text, int start, int end,
float x, int top, int y, int bottom, Paint paint) {
Drawable drawable = getDrawable();
canvas.save();
int transY = 0;
transY = ((bottom - top) - drawable.getBounds().bottom) / 2 + top;
canvas.translate(x, transY);
drawable.draw(canvas);
canvas.restore();
}
}
代碼設(shè)置:
TextView tv = (TextView) findViewById(R.id.tv);
String icon = "icon";
String from = "張全蛋"+icon;
String to = "趙鐵柱";
String txt = String.format("%s回復(fù)@%s:我是富士康3號流水線的張全蛋," +
"英文名叫Micheal Jack,發(fā)文名叫helodie Jaqueline。", from, to);
//設(shè)置ClickSpan,為部分文字("icon")添加點擊效果
SpannableString span = new SpannableString(txt);
ClickSpan clickSpan = new ClickSpan(icon);
span.setSpan(clickSpan, txt.indexOf(icon),
txt.indexOf(icon) + icon.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//設(shè)置ImageSpan,占用可點擊文字("icon")的位置
Bitmap bitmap = ImageUtils.resize(BitmapFactory.decodeResource(getResources(),
R.mipmap.uqmei_icon_contact), DensityUtil.sp2px(this, 12f));
BitmapDrawable drawable = new BitmapDrawable(bitmap);
drawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());
span.setSpan(new VerticalImageSpan(drawable),
txt.indexOf(icon), txt.indexOf(icon) + icon.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//設(shè)置TextView
tv.setText(span);
tv.setHighlightColor(Color.TRANSPARENT);//消除點擊時的背景色
tv.setMovementMethod(LinkMovementMethod.getInstance());
總結(jié)
以上是生活随笔為你收集整理的android 点击图片事件,android图文混排点击事件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 分支管理,Android
- 下一篇: android自适应拉伸图片,Andro