android: MultiAutoCompleteTextView style like gmail

痴心易碎 提交于 2019-12-14 01:26:08

问题


I want create custom MultiAutoCompleteTextView like gmail app:

I create custom view and extend to MultiAutoCompleteTextView and use Span , but I have problem, if there is not enough room for text and image then and span have (space) then view split them

and there is my code for custom view:

public class CustomMultiAutoCompleteTextView extends MultiAutoCompleteTextView {

@Override
public void setTokenizer(Tokenizer t) {
    super.setTokenizer(t);
}

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

public CustomMultiAutoCompleteTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public CustomMultiAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}


@Override
protected void replaceText(CharSequence text) {
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.avatar);
    SpannableStringBuilder builder = new SpannableStringBuilder();
    builder.append("g");
    builder.setSpan(new ImageSpan(getContext(), getRoundedBitmap(bitmap)),
            builder.length() - 1, builder.length(), 0);
    builder.append(text);
    builder.setSpan(new BackgroundColorSpan(Color.GRAY), 1, builder.length(), 0);
    super.replaceText(builder);

}

public static Bitmap getRoundedBitmap(Bitmap bitmap) {
    final Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
    final Canvas canvas = new Canvas(output);

    final int color = Color.RED;
    final Paint paint = new Paint();
    final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
    final RectF rectF = new RectF(rect);

    paint.setAntiAlias(true);
    canvas.drawARGB(0, 0, 0, 0);
    paint.setColor(color);
    canvas.drawOval(rectF, paint);

    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    canvas.drawBitmap(bitmap, rect, rect, paint);

    bitmap.recycle();

    return output;
}


}

So any body have a suggestion?


回答1:


Check these two libraries:

  • kpbird/chips-edittext-library
  • splitwise/TokenAutoComplete

They are doing pretty much what you try to accomplish.

The idea behind at least first library - once onTextChanged happens, you do create a Bitmap out of TextView with text and setting CompoundDrawablesWithIntrinsicBounds (drown on the Canvas).

          TextView textView = (TextView) lf.inflate(R.layout.chips_edittext, null);
            textView.setText(c); // set text
            int image = ((ChipsAdapter) getAdapter()).getImage(c);
            textView.setCompoundDrawablesWithIntrinsicBounds(0, 0, image, 0);
            // capture bitmapt of genreated textview
            int spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
            textView.measure(spec, spec);
            textView.layout(0, 0, textView.getMeasuredWidth(), textView.getMeasuredHeight());
            Bitmap b = Bitmap.createBitmap(textView.getWidth(), textView.getHeight(),Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(b);
            canvas.translate(-textView.getScrollX(), -textView.getScrollY());
            textView.draw(canvas);
            textView.setDrawingCacheEnabled(true);
            Bitmap cacheBmp = textView.getDrawingCache();
            Bitmap viewBmp = cacheBmp.copy(Bitmap.Config.ARGB_8888, true);
            textView.destroyDrawingCache();  // destory drawable
            // create bitmap drawable for imagespan
            BitmapDrawable bmpDrawable = new BitmapDrawable(viewBmp);
            bmpDrawable.setBounds(0, 0,bmpDrawable.getIntrinsicWidth(),bmpDrawable.getIntrinsicHeight());
            // create and set imagespan 
            ssb.setSpan(new ImageSpan(bmpDrawable),x ,x + c.length() , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

Once the image+name is just one bitmap - it can't be no longer wrapped and your issue is solved.



来源:https://stackoverflow.com/questions/35014640/android-multiautocompletetextview-style-like-gmail

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!