package com.tekinarslan.material.sample.customui; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.PaintFlagsDrawFilter; import android.graphics.Rect; import android.graphics.RectF; import android.text.TextPaint; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; import android.view.View; import com.tekinarslan.material.sample.R; public class CustomRoundTextView extends View{ /** * 控件的宽 */ private int mWidth; /** * 控件的高 */ private int mHeight; /** * 控件中的图片 */ private Bitmap mImage; /** * 图片的缩放模式 */ private int mImageScale; private static final int IMAGE_SCALE_FITXY = 0; private static final int IMAGE_SCALE_CENTER = 1; /** * 图片的介绍 */ private String mTitle; /** * 字体的颜色 */ private int mTextColor; /** * 字体的大小 */ private int mTextSize; private Paint mPaint; /** * 对文本的约束 */ private Rect mTextBound; /** * 控制整体布局 */ private Rect rect; public CustomRoundTextView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CustomRoundTextView(Context context) { this(context, null); } /** * 初始化所特有自定义类型 * * @param context * @param attrs * @param defStyle */ public CustomRoundTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomImageView, defStyle, 0); int n = a.getIndexCount(); for (int i = 0; i < n; i++) { int attr = a.getIndex(i); switch (attr) { case R.styleable.CustomImageView_image: mImage = BitmapFactory.decodeResource(getResources(), a.getResourceId(attr, 0)); break; case R.styleable.CustomImageView_imageScaleType: mImageScale = a.getInt(attr, 0); break; case R.styleable.CustomImageView_titleText: mTitle = a.getString(attr); break; case R.styleable.CustomImageView_titleTextColor: mTextColor = a.getColor(attr, Color.BLACK); break; case R.styleable.CustomImageView_titleTextSize: mTextSize = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics())); break; } } a.recycle(); rect = new Rect(); mPaint = new Paint(); mTextBound = new Rect(); mPaint.setTextSize(mTextSize); // 计算了描绘字体需要的范围 mPaint.getTextBounds(mTitle, 0, mTitle.length(), mTextBound); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // super.onMeasure(widthMeasureSpec, heightMeasureSpec); /** * 设置宽度 */ int specMode = MeasureSpec.getMode(widthMeasureSpec); int specSize = MeasureSpec.getSize(widthMeasureSpec); if (specMode == MeasureSpec.EXACTLY)// match_parent , accurate { Log.e("xxx", "EXACTLY"); mWidth = specSize; } else { // 由图片决定的宽 int desireByImg = getPaddingLeft() + getPaddingRight() + mImage.getWidth(); // 由字体决定的宽 int desireByTitle = getPaddingLeft() + getPaddingRight() + mTextBound.width(); int desire = Math.max(desireByImg, desireByTitle); if (specMode == MeasureSpec.AT_MOST)// wrap_content { mWidth = Math.min(desire, specSize); Log.e("xxx", "AT_MOST"); } else { mWidth = desire ; } } /*** * 设置高度 */ specMode = MeasureSpec.getMode(heightMeasureSpec); specSize = MeasureSpec.getSize(heightMeasureSpec); if (specMode == MeasureSpec.EXACTLY)// match_parent , accurate { mHeight = specSize; } else { int desire = getPaddingTop() + getPaddingBottom() + mImage.getHeight() + mTextBound.height(); if (specMode == MeasureSpec.AT_MOST)// wrap_content { mHeight = Math.min(desire, specSize); }else{ mHeight = desire; } } setMeasuredDimension(mWidth, mHeight); // LogUtils.d("width="+mWidth+" height="+mHeight); } @Override protected void onDraw(Canvas canvas) { // super.onDraw(canvas); // LogUtils.d("width=" + getWidth() + " height=" + getHeight()); /** * 边框 */ mPaint.setAntiAlias(true); mPaint.setStrokeWidth(6); mPaint.setStyle(Style.STROKE); mPaint.setColor(Color.CYAN); // canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), mPaint); RectF r2=new RectF(); int strokerWidth = 3; mPaint.setStrokeWidth(strokerWidth); //线宽 // mPaint.setStyle(Style.STROKE); mPaint.setStyle(Style.STROKE); r2.left=strokerWidth; //左边 r2.top=+strokerWidth; //上边 r2.right=getMeasuredWidth()-strokerWidth; //右边 r2.bottom=+getMeasuredHeight()-strokerWidth; // LogUtils.d("getLeft=" + getLeft() + " getTop=" + getTop()); // r2.set(strokerWidth, strokerWidth, getMeasuredWidth() - strokerWidth, getMeasuredHeight() - strokerWidth); mPaint.setFlags(Paint.ANTI_ALIAS_FLAG); canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG)); canvas.drawRoundRect(r2, 50, 50, mPaint); rect.left = getPaddingLeft(); rect.right = mWidth - getPaddingRight(); rect.top = getPaddingTop(); rect.bottom = mHeight - getPaddingBottom(); mPaint.setColor(mTextColor); mPaint.setStyle(Style.FILL); /** * 当前设置的宽度小于字体需要的宽度,将字体改为xxx... */ if (mTextBound.width() > mWidth) { TextPaint paint = new TextPaint(mPaint); String msg = TextUtils.ellipsize(mTitle, paint, (float) mWidth - getPaddingLeft() - getPaddingRight(), TextUtils.TruncateAt.END).toString(); canvas.drawText(msg, getPaddingLeft(), mHeight - getPaddingBottom(), mPaint); } else { //正常情况,将字体居中 canvas.drawText(mTitle, mWidth / 2 - mTextBound.width() * 1.0f / 2, mHeight - getPaddingBottom(), mPaint); } //取消使用掉的快 rect.bottom -= mTextBound.height(); // if (mImageScale == IMAGE_SCALE_FITXY)//fitXY // { // canvas.drawBitmap(mImage, null, rect, mPaint); // } else // { // //计算居中的矩形范围 // rect.left = mWidth / 2 - mImage.getWidth() / 2; // rect.right = mWidth / 2 + mImage.getWidth() / 2; // rect.top = (mHeight - mTextBound.height()) / 2 - mImage.getHeight() / 2; // rect.bottom = (mHeight - mTextBound.height()) / 2 + mImage.getHeight() / 2; // // canvas.drawBitmap(mImage, null, rect, mPaint); // } } }