自定义控件EditText,添加收件人效果

之前写了一个类似的控件,效果不是很好,一次添加的数目过多,显示错位的问题。

现在换了一种方式,目前还没发现问题。下面直接贴代码:

package com.example.mymail.view;


import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Bitmap.Config;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.style.ImageSpan;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.EditText;


public class CustomEditText2 extends EditText {

private Context context;
private int height;
private int times;
private boolean isAllChange;


public CustomEditText2(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}


public CustomEditText2(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
setLineSpacing(2, 1);
}


public CustomEditText2(Context context) {
super(context);
}

@Override
protected void onFocusChanged(boolean focused, int direction,
Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
if(!focused){
changeState();
}else{
if(isAllChange){
append(",");
isAllChange = false;
}
}
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(times == 0){
height = getHeight();
height = height<100?100:height;//这个还是根据具体的屏幕密度自行适配
Log.i("NNN", height+"高度");
}
times++;
}


public void changeState() {
String text = getText().toString().trim();
if(!TextUtils.isEmpty(text)){
String[] arrText = text.split(",");
setText("");
for (int i = 0; i < arrText.length; i++) {
if(TextUtils.isEmpty(arrText[i]))
continue;
Drawable drawable = getDrawable(arrText[i]);  
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());  
SpannableString spannable = new SpannableString(arrText[i]);  
ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BOTTOM);  
spannable.setSpan(span, 0,arrText[i].length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);    
append(spannable);
if(i != arrText.length-1)
append(",");
}
isAllChange = true;
}
}

public Drawable getDrawable(String str){

Drawable drawable = null;
Config config = Config.ARGB_8888;
int textWidth = getTextWidth(str);
Bitmap textBitmap = Bitmap.createBitmap(3*textWidth, height,config );
Canvas canvas = new Canvas(textBitmap);
Paint paint = new Paint();
RectF rect = new RectF(0, 0, 3*textWidth, height);
paint.setColor(Color.GRAY);
canvas.drawRoundRect(rect , 20, 20, paint);
paint.setColor(Color.WHITE);
paint.setAntiAlias(true);
paint.setTextSize(62);
canvas.drawText(str, textWidth/4,28+height/2, paint);

canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore();
drawable = new BitmapDrawable(textBitmap);
return drawable;
}
public int getTextWidth(String str){
Paint mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);  
mTextPaint.setColor(Color.WHITE);  
float textWidth = mTextPaint.measureText(str);
return sp2px(context, textWidth);
}


public static int sp2px(Context context, float spValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
}




评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值