Android 自定义图形实例

来源:互联网 发布:办公软件word视频教程 编辑:程序博客网 时间:2024/05/20 05:27
public class CV1 extends View {    private Paint paint;    private int rect_width = 30;    private int rect_space = 20;    private int[][] rect_array = {{Color.RED, 300},            {Color.GREEN, 400}, {Color.BLUE, 250}, {Color.YELLOW, 500},            {Color.DKGRAY, 600}};    public CV1(Context context) {        super(context);    }    public CV1(Context context, AttributeSet attrs) {        super(context, attrs);        init();    }    public void init() {        paint = new Paint();        paint.setColor(Color.BLACK);        paint.setAntiAlias(true);        paint.setStrokeWidth(3);    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        paint.setTextSize(15);        canvas.drawText("300", 10, getHeight() - 300 - 50, paint);        canvas.drawCircle(50, getHeight() - 350, 5, paint);        paint.setStyle(Paint.Style.FILL_AND_STROKE);        for (int i = 0; i < rect_array.length; i++) {            int left = 50 + (rect_space + rect_width) * i + rect_space;            int top = getHeight() - 50 - rect_array[i][1];            paint.setColor(rect_array[i][0]);            canvas.drawRect(left, top, left + rect_width, getHeight() - 50, paint);        }        //绘制虚线  :DashPathEffect虚线的对象        /**         * float[]:         * 代码当中的数组要求必须是偶数数组,而且必须>=2,指定了多少长度的实线之后在画多少长度的空白,         * 举例:如下代码绘制长度为1的实线,在绘制长度为2的空白,绘制长度为3的实线,在绘制长度为4的空白。         * float: 代表其实位置的偏移量         * */        //绘制x轴://        Path path = new Path();//        path.moveTo(50, getHeight() - 50);//        path.lineTo(getWidth() - 50, getHeight() - 50);//        PathEffect effects = new DashPathEffect(new float[]{5, 5, 5, 5}, 1);//        paint.setPathEffect(effects);//        canvas.drawPath(path, paint);         canvas.drawLine(50, getHeight() - 50, getWidth() - 50, getHeight() - 50, paint);        //绘制x轴的箭头        canvas.drawLine(getWidth() - 50, getHeight() - 50, getWidth() - 75, getHeight() - 75, paint);        canvas.drawLine(getWidth() - 50, getHeight() - 50, getWidth() - 75, getHeight() - 25, paint);        //绘制y轴        canvas.drawLine(50, getHeight() - 50, 50, 50, paint);        //绘制y轴的箭头        canvas.drawLine(50, 50, 25, 75, paint);        canvas.drawLine(50, 50, 75, 75, paint);        //绘制x轴y轴焦点        canvas.drawCircle(50, getHeight() - 50, 2, paint);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);    }}

 <com.example.thinkpad.customview.CustomView1.CV1        android:layout_width="match_parent"        android:layout_height="match_parent"        android:id="@+id/rect"/>

效果:



public class CV2 extends View {    private Paint paint;    private int hours, minutes, seconds;    private int defaultLength = 200;    Handler handler = new Handler() {        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);       //     getTime();            invalidate();            handler.sendEmptyMessageDelayed(1, 1000);        }    };    private void initPaint() {        paint = new Paint();        paint.setColor(Color.BLACK);        paint.setAntiAlias(true);    }    public CV2(Context context) {        super(context);    }    public CV2(Context context, AttributeSet attrs) {        super(context, attrs);        initPaint();        getTime();        handler.sendEmptyMessageDelayed(1, 1000);    }    public void getTime() {        Calendar calendar = Calendar.getInstance();        hours = calendar.get(Calendar.HOUR);        minutes = calendar.get(Calendar.MINUTE);        seconds = calendar.get(Calendar.SECOND);    }    @Override    public void draw(Canvas canvas) {        super.draw(canvas);        //绘制钟表        //绘制圆心        canvas.drawCircle(getWidth() / 2, getHeight() / 2, 8, paint);        //绘制外围表盘        paint.setStrokeWidth(5);        paint.setStyle(Paint.Style.STROKE);        canvas.drawCircle(getWidth() / 2, getHeight() / 2, getWidth() / 2 - 10, paint);        //绘制内表盘        paint.setStrokeWidth(3);        canvas.drawCircle(getWidth() / 2, getHeight() / 2, getWidth() / 2 - 22, paint);        //绘制刻度        //绘制钟表上的刻度        paint.setColor(Color.GRAY);        for (int i = 0; i < 12; i++) {            //保存画布旋转之前的状态            canvas.save();            canvas.rotate(30 * hours + minutes * 0.5f, getWidth() / 2, getHeight() / 2);            canvas.drawLine(getWidth() / 2, getHeight() / 2, getWidth() / 2, getHeight() / 2 - getHeight() / 5, paint);            canvas.restore();        }        //绘制时分秒针        //绘制时针        canvas.save();        canvas.rotate(30 * hours + minutes * 0.5f, getWidth() / 2, getHeight() / 2);        paint.setStrokeWidth(6);        canvas.drawLine(getWidth() / 2, getHeight() / 2, getWidth() / 2, getHeight() / 2 - getHeight() / 5, paint);        canvas.restore();        //绘制分针        canvas.save();        canvas.rotate((360 / 60) * minutes, getWidth() / 2, getHeight() / 2);        paint.setStrokeWidth(3);        canvas.drawLine(getWidth() / 2, getHeight() / 2, getWidth() / 2, getHeight() / 2 - getHeight() / 4, paint);        canvas.restore();        //绘制秒针        canvas.save();        canvas.rotate(6 * seconds, getWidth() / 2, getHeight() / 2);        paint.setStrokeWidth(1);        canvas.drawLine(getWidth() / 2, getHeight() / 2, getWidth() / 2, getHeight() / 2 - getHeight() / 3, paint);        canvas.restore();    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        int wMode = MeasureSpec.getMode(widthMeasureSpec);        int hMode = MeasureSpec.getMode(heightMeasureSpec);        //获取到可以设置的最大的尺寸        int wSize = MeasureSpec.getSize(widthMeasureSpec);        int hSize = MeasureSpec.getSize(heightMeasureSpec);        switch (wMode) {            case MeasureSpec.EXACTLY:                wSize = hSize = Math.min(wSize, hSize);                break;            case MeasureSpec.AT_MOST:   //宽:wrap_content  高:100    谁小按照谁画                if (hMode == MeasureSpec.AT_MOST || hSize > defaultLength) {                    wSize = hSize = defaultLength;                } else {                    wSize = hSize;    //高比宽小,按照小的画                }                break;        }        setMeasuredDimension(wSize, hSize);    }}
 <com.example.thinkpad.customview.CustomView2.CV2       android:layout_width="match_parent"       android:layout_height="match_parent" />
效果:


public class CV4 extends View {    private Paint paint;    private int sweepAngle = 0;   //扫描的起始角度    private int sweepStep = 5;   //每次扫描的角度    private int defalut_width = 100;    private int default_height = 100;    private int circleColor = Color.GRAY;    private int sweepColor = Color.GREEN;    private int padding = 5;    private int startAngle = -90;    private void initPaint(){        paint = new Paint();        paint.setAntiAlias(true);        paint.setColor(circleColor);    }    public CV4(Context context) {        super(context);    }    public CV4(Context context, AttributeSet attrs) {        super(context, attrs);        initPaint();    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        paint.setColor(circleColor);        canvas.drawCircle(getWidth()/2,getHeight()/2,getWidth()/2-padding,paint);        paint.setColor(sweepColor);        /**         * 绘制扇形:         * 1.rectf:指代扇形的容器,矩形对象,         * 2,startAngle:起始的角度         * 3,sweepAngle 扫描的角度         * 4:userCenter  :         * */        canvas.drawArc(new RectF(padding,padding,getWidth()                        -padding,getHeight()-padding),                startAngle,sweepAngle,true,paint);        sweepAngle =sweepAngle+sweepStep;        sweepAngle = sweepAngle>360?0:sweepAngle;        //重新绘制图形        invalidate();    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        int widthMode = MeasureSpec.getMode(widthMeasureSpec);        int heightMode = MeasureSpec.getMode(heightMeasureSpec);        int wSize = MeasureSpec.getSize(widthMeasureSpec);        int hSize = MeasureSpec.getSize(heightMeasureSpec);        switch (widthMode) {            case MeasureSpec.AT_MOST:                wSize = defalut_width;                hSize = default_height;                break;            case MeasureSpec.EXACTLY:                wSize = hSize = Math.min(wSize,hSize);                break;        }        setMeasuredDimension(wSize,hSize);    }}
 <com.example.thinkpad.customview.CustomView4.CV4        android:layout_width="200dp"        android:layout_height="200dp" />

效果:






0 0
原创粉丝点击