自定义View(一)

来源:互联网 发布:淘宝卖烟丝的怎么搜索 编辑:程序博客网 时间:2024/05/16 14:45

一.获取属性

1.资源文件定义attr.xml

派生到我的代码片    <?xml version="1.0" encoding="utf-8"?>      <resources>          <attr name="titleText" format="string" />          <attr name="titleTextSize" format="dimension" />          <attr name="titleTextColor" format="color" />          <attr name="image" format="reference" />          <attr name="imageScaleType">              <enum name="fillXY" value="0" />              <enum name="center" value="1" />          </attr>          <declare-styleable name="CustomImageView">              <attr name="titleText" />              <attr name="titleTextSize" />              <attr name="titleTextColor" />              <attr name="image" />              <attr name="imageScaleType" />          </declare-styleable>      </resources>  
    /**          * 初始化所特有自定义类型          *           * @param context          * @param attrs          * @param defStyle          */          public CustomImageView(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);          }  

二.测量的方法

重新ondMeasure的方法,并根据是否视频父容器或者子view的图片或文字设置大小

    @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();              if (specMode == MeasureSpec.AT_MOST)// wrap_content              {                  int desire = Math.max(desireByImg, desireByTitle);                  mWidth = Math.min(desire, specSize);                  Log.e("xxx", "AT_MOST");              }          }          /***          * 设置高度          */          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);              }          }          setMeasuredDimension(mWidth, mHeight);      }  

三.重写draw的方法,其实

    @Override          protected void onDraw(Canvas canvas)          {              // super.onDraw(canvas);              /**              * 边框              */              mPaint.setStrokeWidth(4);              mPaint.setStyle(Paint.Style.STROKE);              mPaint.setColor(Color.CYAN);              canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), 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)              {                  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);              }          }  
0 0
原创粉丝点击