Android绘图机制(三)——自定义View的实现方式以及半弧圆新控件

Android绘图机制(三)——自定义View的三种实现方式以及实战项目操作


Android绘图机制(一)——自定义View的基础属性和方法
里说过,实现自定义View有三种方式,分别是

1.对现有的控件进行扩展
2.通过组件来实现新的控件
3.重写View来实现全新的控件

所以本节就来带大家把这个流程走一遍,我们用到的项目还是
Android绘图机制(二)——自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解
本节现在就是做一个真正意义上的自定义View的操作了

注意本节的项目来自于《Android群英传》中的几个小例子

一.对现有的控件进行扩展之自定义TextView

我们新建一个Class类TextView继承TextView
package com.lgl.view.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;

/**
 * Created by LGL on 2016/1/10.
 */
public class TextView extends android.widget.TextView {

    private Paint paint1, paint2;

    public TextView(Context context) {
        super(context);
    }

    public TextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onDraw(Canvas canvas) {

        //实例化画笔
        paint1 = new Paint();
        //给画笔1设置颜色
        paint1.setColor(getResources()
                .getColor(android.R.color.holo_blue_light));
        //给画笔1设置Style
        paint1.setStyle(Paint.Style.FILL);

        //实例化画笔
        paint2 = new Paint();
        //给画笔2设置颜色
        paint2.setColor(Color.YELLOW);
        //给画笔2设置Style
        paint2.setStyle(Paint.Style.FILL);

        //绘制外层矩形
        canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), paint1);
        //绘制内层矩形
        canvas.drawRect(10, 10, getMeasuredWidth() - 10, getMeasuredHeight() - 10, paint2);
        canvas.save();
        //父类完成的方法,即绘制完成
        super.onDraw(canvas);
    }
}

截图

二.重写View来实现全新的控件

市面上有许许多多的APP,他们之中有很多的控件都不是原生的,而是需要我们自定义View的
package com.lgl.view.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
import android.view.WindowManager;

/**
 * 半弧圆
 * Created by LGL on 2016/1/10.
 */
public class RCircleView extends View {

    //弧的画笔
    private Paint rpaint;
    //圆的画笔
    private Paint cpaint;
    //文字的画笔
    private Paint tvpaint;
    //屏幕高宽
    private int width, height;
    //文字
    private String text = "绘制半弧圆";

    public RCircleView(Context context) {
        super(context);
        init();
    }

    public RCircleView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        //获取屏幕的宽高
        //Android绘图机制(一)——自定义View的基础属性和方法里面有讲
        WindowManager wm = (WindowManager) getContext()
                .getSystemService(Context.WINDOW_SERVICE);

        width = wm.getDefaultDisplay().getWidth();
        height = wm.getDefaultDisplay().getHeight();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        //实例化画笔,以及设置属性,颜色,文字大小
        rpaint = new Paint();
        rpaint.setStyle(Paint.Style.STROKE);
        cpaint = new Paint();
        tvpaint = new Paint();
        tvpaint.setColor(Color.WHITE);
        tvpaint.setTextSize(20);
        //绘制弧线的区域矩形
        RectF mArcRectF = new RectF((float) (width * 0.1), (float) (width * 0.1), (float) (width * 0.9), (float) (width * 0.9));
        //绘制圆
        canvas.drawCircle(width / 2, width / 2, (float) (width * 0.5 / 3), cpaint);
        //绘制弧线
        canvas.drawArc(mArcRectF, 270, 240, false, rpaint);
        //这样绘制的话,会出现偏差的,文字以圆形的中心开始绘制
        canvas.drawText(text, width / 2, width / 2, tvpaint);
    }
}

截图

这里,你会疑惑,为什么文字不是居中?我们来画个图

这个还是比较基础的,下一节我们就来点新的玩法

Demo下载:本系列最后一节提供

时间: 2024-12-24 04:09:42

Android绘图机制(三)——自定义View的实现方式以及半弧圆新控件的相关文章

Android绘图机制(二)——自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解

Android绘图机制(二)--自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解 我们要想画好一些炫酷的View,首先我们得知道怎么去画一些基础的图案,比如矩形,圆形,三角形,多边形等-. 新建一个项目 然后我们创建一个listview,每个图案一个Activity,这样看起来是不是很顺眼 <ListView android:id="@+id/listview" android:layout_width="wrap_content&q

Android绘图机制(一)——自定义View的基础属性和方法

Android绘图机制(一)--自定义View的基础属性和方法 自定义View看起来,确实看起来高深莫测,很多Android开发都不是特别在行这一块,这里面的逻辑以及一些绘画都是有一点难的,说一下我目前的状况吧,结束了一个项目,现在接手一个新的项目,老项目的时候自己确实花了点时间去研究,包括看一些相关的博文和数据,新项目的自定义View更多,现在大致的对自定义View有了一些了解,但是你要说我会呢?我确实还没有掌握,只不过我把 我画的一些柱形图和其他图 的想法写出来,当然,你要让我说原理我肯定说

Android群英传笔记——第六章:Android绘图机制与处理技巧

Android群英传笔记--第六章:Android绘图机制与处理技巧 一直在情调,时间都是可以自己调节的,不然世界上哪有这么多牛X的人 今天就开始读第六章了,算日子也刚好一个月了,一个月就读一半,这效率也确实有点低了,自己还要加把劲,争取四月底全部看完,第六章讲的是Android的绘图机制,应该算是比较核心的东西了,不管什么功能,最终都是以图形的方式呈现给用户的,因此,掌握Android的绘图技巧,可以在让你设计应用的时候更加的随心所欲,对Android的理解更高 基本的绘图方法,相信读者都已经

Android绘图机制(四)——使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美

Android绘图机制(四)--使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美 这里为什么不继续把自定义View写下去呢,因为最近项目很急,个人能力也有限,所以就在网上找到一些开源的框架使用,不是MPAndroidChart,也不是AChartEngine ,而是HelloCharts 开源地 址:https://github.com/lecho/hellocharts-android 这次主要是翻译了一些注释和简化了一下项目的结

Android特效专辑(三)——自定义不一样的Toast

Android特效专辑(三)--自定义不一样的Toast 大家都知道,Android的控件有时候很难满足我们的需求,所以我们需要自定义View.自定义的方式很多,有继承原生控件也有直接自定义View的,今天写的是自定义的Toast,当然,这个不是复写Toast,是换一种表达形式,哈哈,后续会增加自定义View的方方面面 这里啰嗦几句,我看到网上很多教程写的很不详细,就像是直接CV过来的一样,所以有时间我就会把我需要的东西写起来,然后尽可能的描述的清楚一点,以后我工作用到了就可以直接拿来用了,同时

Android 仿淘宝、京东商品详情页向上拖动查看图文详情控件DEMO详解_Android

一.淘宝商品详情页效果 我们的效果 二.实现思路      使用两个scrollView,两个scrollView 竖直排列,通过自定义viewGroup来控制两个scrollView的竖直排列,以及滑动事件的处理.如下图 三.具体实现 1.继承viewGroup自定义布局View 重写onMeasure()和onLayout方法,在onLayout方法中完成对两个子ScrollView的竖直排列布局,代码如下: 布局文件: <RelativeLayout xmlns:android="h

Android的include中,怎么获取不同include中的相同布局中的控件id

问题描述 Android的include中,怎么获取不同include中的相同布局中的控件id 比如,我的layout.xml中只有一个ImageButton 在另一个tablelayout.xml中通过include调用layout.xml 但是我想在activity中获取不同include中的imageButton的ID 解决方案 系统不会管你在layout中声明了多少个相同ID的View的,通过findViewByID查找控件时,它只关注子View内是否有符合ID的View,其他同ID的V

Flex自定义组件开发之日周月日期选择日历控件

原文:Flex自定义组件开发之日周月日期选择日历控件           使用过DateField的我们都知道,DateField 控件是用于显示日期的文本字段,字段右侧带有日历图标.当用户在控件边框内的任一位置单击时,将弹出一个 DateChooser 控件,显示当月的所有日期.如果未选择日期,则该文本字段为空白,并且 DateChooser 控件中将显示当前日期的月份.当 DateChooser 控件处于打开状态时,用户可以在各个月份和年份之间滚动,并选择某个日期.选择日期后,DateCho

Android App开发中自定义View和ViewGroup的实例教程_Android

ViewAndroid所有的控件都是View或者View的子类,它其实表示的就是屏幕上的一块矩形区域,用一个Rect来表示,left,top表示View相对于它的parent View的起点,width,height表示View自己的宽高,通过这4个字段就能确定View在屏幕上的位置,确定位置后就可以开始绘制View的内容了. View绘制过程View的绘制可以分为下面三个过程: MeasureView会先做一次测量,算出自己需要占用多大的面积.View的Measure过程给我们暴露了一个接口o