码迷,mamicode.com
首页 > 其他好文 > 详细

自定义View

时间:2015-11-05 14:50:45      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:

上代码比较直观

 

package com.weidingqiang.customchinacar.views.mapview;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;

import com.weidingqiang.customchinacar.R;

/**
 * Created by weidingqiang on 15/11/4.
 */
public class MapTipView extends View {
    //TAG标记
    private static final String TAG = MapTipView.class.getSimpleName();
    //加载状态
    public static final int STATE_LOADING = 1;
    //加载完成状态
    public static final int STATE_LOADED = 2;
    //加载完时间的状态
    public static final int STATE_SHOWTIME = 3;
    //当前状态
    private int _current = STATE_LOADING;
    //加载中的文字
    private static final String loadingtext = "正在获取地址..";
    //加载中的文字字体颜色
    private int loadingColor = getResources().getColor(R.color.gray);
    //加载中的字体大小
    private int loadingSize = 24;
    //加载中的字体宽度
    private int loadingTextWidth;
    //加载中的字体宽度
    private int loadingTextHeight;
    //paint
    private Paint paint;
    //获取文字所占用的矩形
    private Rect rect;
    //向右的箭头
    private Bitmap arrowRight;

    //---------------------------------------------------------------------------------------------//
    //状态 STATE_LOADED 的 属性
    //位置
    private String _address1,_address2;

    private int _address1Color = getResources().getColor(R.color.gold);
    private int _address2Color = getResources().getColor(R.color.gray);

    private int _address1Size = 28;
    private int _address2Size = 24;

    private int _address1Width,_address1Height;
    private int _address2Width,_address2Height;

    private static final String label1 = "我在";
    private static final String label2 = "上车";

    private int _labelColor = getResources().getColor(R.color.black);
    private int _labelSize = 26;

    private int _labelWidth,_labelHeight;

    private Bitmap  mBackGround;

    public MapTipView(Context context) {
        this(context, null);
    }

    public MapTipView(Context context, AttributeSet attrs) {
        super(context, attrs);

        paint = new Paint();
        rect = new Rect();

        arrowRight = BitmapFactory.decodeResource(getResources(),R.drawable.arrow_right_gray_new);

        mBackGround = BitmapFactory.decodeResource(getResources(),R.drawable.map_tip_bg);
    }

    /**
     * 重写之前先了解MeasureSpec的specMode,一共三种类型:

     EXACTLY:一般是设置了明确的值或者是MATCH_PARENT

     AT_MOST:表示子布局限制在一个最大值内,一般为WARP_CONTENT

     UNSPECIFIED:表示子布局想要多大就多大,很少使用
     http://blog.csdn.net/lmj623565791/article/details/24252901

     * @param widthMeasureSpec
     * @param heightMeasureSpec
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
        int _width = 0;
        int _height = 0;

//        mPaint.setTextSize(mTitleTextSize);
//        mPaint.getTextBounds(mTitle, 0, mTitle.length(), mBounds);
//        float textWidth = mBounds.width();
//        int desired = (int) (getPaddingLeft() + textWidth + getPaddingRight());
//        width = desired;

        switch (_current){
            case STATE_LOADING:
                paint.setTextSize(loadingSize);
                paint.getTextBounds(loadingtext,0,loadingtext.length(),rect);
                loadingTextWidth = rect.width();
                loadingTextHeight = rect.height();
                //需要文字的宽度加上箭头的宽度
                int desiredW = (int) (getPaddingLeft() + loadingTextWidth +arrowRight.getWidth()+ getPaddingRight());
                //int desiredW = (int) (getPaddingLeft() + loadingTextWidth + getPaddingRight());
                int desiredH = (int) (getPaddingTop() + loadingTextHeight + getPaddingBottom());
                _width = desiredW;
                _height = desiredH;
                break;
            case STATE_LOADED:
                //1.计算 “我在“  宽高
                paint.setTextSize(_labelSize);
                paint.getTextBounds(label1,0,label1.length(),rect);
                _labelHeight = rect.height();
                _labelWidth = rect.width();
                //2.计算 address1 宽高
                paint.setTextSize(_address1Size);
                paint.getTextBounds(_address1,0,_address1.length(),rect);
                _address1Height = rect.height();
                _address1Width = rect.width();
                //3.计算 address2 宽高
                paint.setTextSize(_address2Size);
                paint.getTextBounds(_address2,0,_address2.length(),rect);
                _address2Height = rect.height();
                _address2Width = rect.width();
                //4.综合计算
                int maxWidth = Math.max(_labelWidth*2+_address1Width,_address2Width);
                _width = (int) (getPaddingLeft() + maxWidth +arrowRight.getWidth()+ getPaddingRight());
                _height = (int) (getPaddingTop() + _address1Height +_address2Height+ getPaddingBottom());

                break;
            case STATE_SHOWTIME:
                break;

        }

        setMeasuredDimension(_width,_height);
    }

    @Override
    protected void onDraw(Canvas canvas) {

        //重新设置组件宽高
        ViewGroup.LayoutParams layoutParams = getLayoutParams();
        layoutParams.height = getMeasuredHeight();
        layoutParams.width = getMeasuredWidth();
        setLayoutParams(layoutParams);

        switch (_current){
            //只显示加载中
            case STATE_LOADING:
                //画文字
                paint.setColor(loadingColor);
                paint.setTextSize(loadingSize);
                int _x = getWidth() / 2 - loadingTextWidth / 2;
                int _y = getHeight() / 2 + loadingTextHeight / 2 - 10;//10 为偏移量
                canvas.drawText(loadingtext,_x , _y, paint);
                //画图片
                int _bitmapx = _x + loadingTextWidth + 12;//2 为偏移量
                int _bitmapy = getHeight() / 2 - arrowRight.getHeight() / 2 - 6;//10 为偏移量;
                canvas.drawBitmap(arrowRight,_bitmapx,_bitmapy,paint);

                break;
            case STATE_LOADED:

                //画 “我在”
                paint.setColor(_labelColor);
                paint.setTextSize(_labelSize);

                int _label1x = getPaddingLeft();
                int _label1y = getPaddingTop() + 10;
                canvas.drawText(label1,_label1x,_label1y,paint);

                //画 地点
                paint.setColor(_address1Color);
                paint.setTextSize(_address1Size);
                int _address1x = _label1x + _labelWidth;
                int _address1y = _label1y;
                canvas.drawText(_address1,_address1x,_address1y,paint);

                //画 上车
                paint.setColor(_labelColor);
                paint.setTextSize(_labelSize);

                int _label2x = _address1x+_address1Width;
                int _label2y = _address1y;
                canvas.drawText(label2,_label2x,_label2y,paint);

                //画 路口
                paint.setColor(_address2Color);
                paint.setTextSize(_address2Size);
                int _address2x = _label1x ;
                int _address2y = _label1y+ _labelHeight + 10;
                canvas.drawText(_address2,_address2x,_address2y,paint);

                //画图片
                int _bitmap2x = getWidth() - arrowRight.getWidth() - 14;//2 为偏移量
                int _bitmap2y = getHeight() / 2 - arrowRight.getHeight() / 2 - 6;//10 为偏移量;
                canvas.drawBitmap(arrowRight,_bitmap2x,_bitmap2y,paint);

                break;
            case STATE_SHOWTIME:
                break;

        }

    }

    public void changeState(int state){
        this.changeState(state,"","");
    }

    public void changeState(int state,String address1,String address2){
        this.changeState(state,address1,address2,"");
    }

    private int measure = 100;

    public void changeState(int state,String address1,String address2,String time){
        _current = state;
        _address1 = address1;
        _address2 = address2;

        //改变宽高 才能执行 onMeasure
        measure++;
        this.measure(measure,measure);
        //调用ondraw方法
        postInvalidate();
    }
}

  

自定义View

标签:

原文地址:http://www.cnblogs.com/weidingqiang/p/4939286.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!