0909修改
package com.example.myapplication;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.nfc.Tag;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
/**
* Created by Administrator on 2016/8/12.
*/
public class MenuItemView extends View {
private static final String TAG = "MenuItemView";
// 基本属性
private String mText;
private int mDrawLeft;
private int mDrawRight;
// 文字画笔
private Paint mPaintText;
private int mTextSize;
private int mTextColor;
private Rect mRect; // 用于计算 text 的宽高
private float mTextPaddLeft;
// 左右 图片
private Bitmap mRightBitmap;
private Bitmap mleftBitmap;
private int mLineColor;
private int mLineBackground;
private float mLineSize;
private Paint mLinePaint;
private int mLineStartMode;
private int mLineEndMode;
public MenuItemView(Context context) {
super(context);
}
public MenuItemView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray typeArray = context.obtainStyledAttributes(attrs, R.styleable.MenuItemView);
mText = typeArray.getString(R.styleable.MenuItemView_text);
mDrawLeft = typeArray.getResourceId(R.styleable.MenuItemView_drawLeft, R.mipmap.ic_launcher);
mDrawRight = typeArray.getResourceId(R.styleable.MenuItemView_drawRight, R.mipmap.ic_launcher);
mTextSize = (int) typeArray.getDimension(R.styleable.MenuItemView_textSize, 16);
mTextColor = typeArray.getColor(R.styleable.MenuItemView_textColor, 0xFFFFFFFF);
mTextPaddLeft = typeArray.getDimensionPixelSize(R.styleable.MenuItemView_textPaddLeft, 0);
// 设置字体
mPaintText = new Paint();
mPaintText.setColor(mTextColor);
mPaintText.setTextSize(mTextSize);
mPaintText.setAntiAlias(true);
mPaintText.setTextAlign(Paint.Align.LEFT);
mRect = new Rect();
mPaintText.getTextBounds(mText, 0, mText.length(), mRect);
mRightBitmap = BitmapFactory.decodeResource(getResources(), mDrawRight);
mleftBitmap = BitmapFactory.decodeResource(getResources(), mDrawLeft);
mLineColor = typeArray.getColor(R.styleable.MenuItemView_lineColor, 0xFFFFFFFF);
mLineBackground = typeArray.getColor(R.styleable.MenuItemView_lineBackground, 0xFFFFFFFF);
mLineSize = typeArray.getDimensionPixelSize(R.styleable.MenuItemView_lineSize, 1);
mLineStartMode = typeArray.getInt(R.styleable.MenuItemView_lineStart, 0);
mLineEndMode = typeArray.getInt(R.styleable.MenuItemView_lineEnd, 0);
mLinePaint = new Paint();
mLinePaint.setColor(mLineColor);
}
public MenuItemView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//1 这个也可以居中
// Paint.FontMetrics fontMetrics = mPaintText.getFontMetrics();
// float offY = (fontMetrics.bottom - fontMetrics.top) / 2 - fontMetrics.bottom;
// canvas.drawText(mText, -mRect.left + getPaddingLeft() + mleftBitmap.getWidth(),getHeight()/2+offY, mPaintText);
// 2 这个 比较居中
canvas.drawText(mText, -mRect.left + getPaddingLeft() + mleftBitmap.getWidth() + mTextPaddLeft, -mRect.top / 2 + getHeight() / 2, mPaintText);
// canvas.drawBitmap(mleftBitmap, getPaddingLeft(), getPaddingTop(), null);
drawBitmap(canvas,mleftBitmap, getPaddingLeft(), getPaddingTop());
//canvas.drawBitmap(mRightBitmap, getWidth() - getPaddingRight() - mRightBitmap.getWidth(), getPaddingTop(), null);
drawBitmap(canvas,mRightBitmap, getWidth() - getPaddingRight() - mRightBitmap.getWidth(), getPaddingTop());
drawLine(canvas);
}
/*---------------------------------
* 绘制图片
* @param x屏幕上的x坐标
* @param y屏幕上的y坐标
* @param w要绘制的图片的宽度
* @param h要绘制的图片的高度
* @param bx图片上的x坐标
* @param by图片上的y坐标
* 参考 http://www.cnblogs.com/error404/archive/2012/02/05/2339255.html
* @return null
------------------------------------*/
/**
* 1 图片 比 可画 的高度下
* 2. 图片 比 可画的 高度大
* @param canvas
* @param bitmap
* @param x
* @param y
*/
private void drawBitmap(Canvas canvas, Bitmap bitmap, int x, int y)
{
int bx=0;
int by=0;
//x,y表示绘画的起点,
Rect src = new Rect();// 图片
Rect dst = new Rect();// 屏幕位置及尺寸
//src 这个是表示绘画图片的大小
src.left = bx; //0,0
src.top = by;
src.right = bitmap.getWidth(); //bx + w;// mBitDestTop.getWidth();,这个是桌面图的宽度,
src.bottom = bitmap.getHeight();// by + h;//mBitDestTop.getHeight()/2;// 这个是桌面图的高度的一半
// 下面的 dst 是表示 绘画这个图片的位置
dst.left = x; //miDTX,//这个是可以改变的,也就是绘图的起点X位置
dst.top = (getHeight() -getPaddingTop()-getPaddingBottom()-bitmap.getHeight())/2+ getPaddingTop() ; //mBitQQ.getHeight();//这个是QQ图片的高度。 也就相当于 桌面图片绘画起点的Y坐标
dst.right = x+bitmap.getWidth(); //miDTX + mBitDestTop.getWidth();// 表示需绘画的图片的右上角
dst.bottom = (getHeight()+bitmap.getHeight())/2 ; // mBitQQ.getHeight() + mBitDestTop.getHeight();//表示需绘画的图片的右下角
canvas.drawBitmap(bitmap, src, dst, null);//这个方法 第一个参数是图片原来的大小,第二个参数是 绘画该图片需显示多少。也就是说你想绘画该图片的某一些地方,而不是全部图片,第三个参数表示该图片绘画的位置
src = null;
dst = null;
}
/**
* <flag name="padd" value="0"/>
<flag name="draw" value="1"/>
<flag name="text" value="2"/>
<flag name="view" value="3"/>
* @param canvas
*/
private void drawLine(Canvas canvas) {
float left=getPaddingLeft();
float right=getWidth() -getPaddingRight();
switch (mLineStartMode) {
case 2:
left=getPaddingLeft() + mleftBitmap.getWidth() + mTextPaddLeft - mRect.left;
// canvas.drawLine(getPaddingLeft() + mleftBitmap.getWidth() + mTextPaddLeft - mRect.left, getHeight() - mLineSize - getPaddingBottom(),
// getWidth() - getPaddingRight() - mRightBitmap.getWidth(), getHeight() - mLineSize - getPaddingBottom(), mLinePaint);
break;
}
switch (mLineEndMode){
case 1:
break;
case 3:
right=getWidth()+getPaddingRight();
break;
}
// canvas.drawLine 只有 1px 的高度 改成 canvas.drawRect
int bLeft=0;
int bright=getWidth();
int bHeight= (int) (getHeight()-getPaddingBottom()-mLineSize);
mLinePaint.setColor(mLineBackground);
canvas.drawRect(bLeft,bHeight,bright,bHeight+mLineSize,mLinePaint);
mLinePaint.setColor(mLineColor);
int lHeight= (int) (getHeight() - getPaddingBottom()-mLineSize);
canvas.drawRect(left,lHeight,right,lHeight+mLineSize,mLinePaint);
// canvas.drawLine(left, getHeight() - getPaddingBottom()-mLineSize, right, getHeight() - getPaddingBottom()-mLineSize, mLinePaint);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec); // 设置 大小
int height = 0;
int width = View.MeasureSpec.getSize(widthMeasureSpec);
/**
* 设置高度
*/
int specMode = MeasureSpec.getMode(heightMeasureSpec); // 获取高 的模式 match_parent wrap_content
/**
* MeasureSpec.EXACTLY是精确尺寸,当我们将控件的layout_width或layout_height指定为具体数值时如andorid:layout_width="50dip",或者为FILL_PARENT是,都是控件大小已经确定的情况,都是精确尺寸。
* MeasureSpec.AT_MOST是最大尺寸,当控件的layout_width或layout_height指定为WRAP_CONTENT时,控件大小一般随着控件的子空间或内容进行变化,此时控件尺寸只要不超过父控件允许的最大尺寸即可。因此,此时的mode是AT_MOST,size给出了父控件允许的最大尺寸。
* MeasureSpec.UNSPECIFIED是未指定尺寸,这种情况不多,一般都是父控件是AdapterView,通过measure方法传入的模式。
*/
if (specMode == MeasureSpec.EXACTLY)// match_parent , accurate
{
height = Math.max(height, View.MeasureSpec.getSize(heightMeasureSpec));
} else {
height = Math.max(height, mRect.height());
height = Math.max(height, mleftBitmap.getHeight());
height = Math.max(height, mRightBitmap.getHeight());
height = height + getPaddingTop() + getPaddingBottom();
}
setMeasuredDimension(width, height);
}
private void Log(String log) {
Log.e(TAG, log);
}
}
attrs
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MenuItemView">
<attr name="drawLeft" format="reference"></attr>
<attr name="drawRight" format="reference"></attr>
<attr name="text" format="string"></attr>
<attr name="textSize" format="dimension"></attr>
<attr name="textColor" format="color"></attr>
<attr name="textPaddLeft" format="dimension"></attr>
<attr name="lineColor" format="color"></attr>
<attr name="lineBackground" format="color"></attr>
<attr name="lineSize" format="dimension"/>
<attr name="lineStart" >
<flag name="padd" value="0"/>
<flag name="draw" value="1"/>
<flag name="text" value="2"/>
<flag name="view" value="3"/>
</attr>
<attr name="lineEnd" >
<flag name="padd" value="0"/>
<flag name="draw" value="1"/>
<flag name="text" value="2"/>
<flag name="view" value="3"/>
</attr>
</declare-styleable>
</resources>
xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/darker_gray"
android:orientation="vertical"
tools:context="com.example.myapplication.MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginBottom="10dp"
android:background="@android:color/white"
android:drawableLeft="@mipmap/ic_my_clear_cache"
android:drawableRight="@mipmap/ic_right"
android:gravity="center"
android:text="aghjbk大白繁!"
android:textColor="@android:color/darker_gray"
android:textSize="26sp" />
<com.example.myapplication.MenuItemView
android:id="@+id/menuItemView"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@android:color/white"
app:textSize="16sp"
app:text="aghjbk大白繁"
app:textColor="@android:color/darker_gray"
app:textPaddLeft="10dp"
app:drawLeft="@mipmap/ic_my_clear_cache"
app:drawRight="@mipmap/ic_right"
app:lineColor="@android:color/holo_blue_light"
app:lineSize="1dp"
app:lineStart="text"
app:lineEnd="view"
app:lineBackground="@color/colorPrimary"
/>
<com.example.myapplication.MenuItemView
android:layout_marginTop="2dp"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@android:color/white"
android:padding="5dp"
app:textSize="16sp"
app:drawLeft="@mipmap/ic_my_clear_cache"
app:drawRight="@mipmap/ic_right"
app:lineColor="@android:color/holo_blue_light"
app:lineSize="1dp"
app:lineStart="view"
app:lineBackground="@color/colorPrimary"
app:text="aghjbk大白繁"
app:textColor="@android:color/darker_gray"
app:textPaddLeft="10dp"
android:id="@+id/menuItemView2" />
</LinearLayout>