Android 自定义View 常用菜单的中的Table

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013148839/article/details/52225248

这里写图片描述
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>

详情请看代码

猜你喜欢

转载自blog.csdn.net/u013148839/article/details/52225248