• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > 一个规范的自定义View——Android开发艺术探索笔记

一个规范的自定义View——Android开发艺术探索笔记

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了自定义您的探索队列,探索者自定义快捷键,steam自定义探索队列,自心宝藏的探索,自心宝藏的探索问答等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

一个规范的自定义View——Android开发艺术探索笔记


一个不规范的自定义View

这个自定义的View很简单,就是画一个圆,实现一个圆形效果的自定义View。

先看一个不规范的自定义View是怎么做的

public class CircleView extends View {

    private int mColor = Color.RED;
    private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

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

    public CircleView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CircleView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        mPaint.setColor(mColor);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        int width = getWidth();
        int height = getHeight();
        int radius = Math.min(width, height) / 2;
        canvas.drawCircle(width / 2, height / 2, radius, mPaint);
    }
}

对应的xml

这样虽然也能画出一个圆来,但是这并不是一个规范的自定义View,主要存在以下问题:

android:padding属性是不能使用的 使用wrap_content就相当于使用match_partent

一个规范的自定义View

为了解决以上问题需要重写View的onMeasure和onDraw方法。

完整代码如下:

public class CircleView extends View {

    private int mColor = Color.RED;
    private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

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

    public CircleView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CircleView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleView);
        mColor = a.getColor(R.styleable.CircleView_circle_color, Color.RED);
        a.recycle();
        init();
    }

    private void init() {
        mPaint.setColor(mColor);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
        if (widthSpecMode == MeasureSpec.AT_MOST
                && heightSpecMode == MeasureSpec.AT_MOST) {
            setMeasuredDimension(200, 200);
        } else if (widthSpecMode == MeasureSpec.AT_MOST) {
            setMeasuredDimension(200, heightSpecSize);
        } else if (heightSpecMode == MeasureSpec.AT_MOST) {
            setMeasuredDimension(widthSpecSize, 200);
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        final int paddingLeft = getPaddingLeft();
        final int paddingRight = getPaddingRight();
        final int paddingTop = getPaddingTop();
        final int paddingBottom = getPaddingBottom();
        int width = getWidth() - paddingLeft - paddingRight;
        int height = getHeight() - paddingTop - paddingBottom;
        int radius = Math.min(width, height) / 2;
        canvas.drawCircle(paddingLeft + width / 2, paddingTop + height / 2,
                radius, mPaint);
    }
}

添加自定义属性

在values文件夹下添加attrs.xml



    
        
    

自定义的属性集合CircleView,在这个属性集合里只定义了一个格式为color的属性circle_color。

在View的构造函数中解析自定义的属性

 public CircleView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleView);
        mColor = a.getColor(R.styleable.CircleView_circle_color, Color.RED);
        a.recycle();
        init();
    }

在布局文件中使用自定义属性

   

在使用自定义的属性时,要在schemas声明:xmlns:app=”http://schemas.android.com/apk/res-auto”,使用时与普通属性类似,app:circle_color=”@color/light_green” 。

自定义View须知

自定义的View中margin属性可以使用,因为它是由父容器控制的 直接继承View或ViewGroup的需要自己处理wrap_content View要在onDraw方法中要处理padding,而ViewGroup要在onMeasure和onLayout中处理padding和margin View中的post方法可以取代handler 在View的onDetachedFromWindow中停止动画,防止内存泄露 有滑动嵌套情形时,注意滑动冲突处理 

想要自定义出漂亮的View并不容易,只有多读,多写,多测,才能更好的掌握。自己造一个轮子,然后再对比成熟的轮子去找差距和不足。

欢迎转载,转载请注明原文链接http://blog.csdn.net/l664675249/article/details/50787973

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 一个规范的自定义View——Android开发艺术探索笔记

相关文章

  • 2017-05-26Android开源项目分类汇总(六)工具库
  • 2017-05-26android:eclipse看着很舒服的字体和启动速度很快android模拟器
  • 2017-08-02Android系统服务(一)解析ActivityManagerService(AMS)
  • 2017-05-26android的消息提示(震动与提示音),android
  • 2017-05-26SharedPreferences详解,sharedpreferences
  • 2017-05-26volley框架的使用
  • 2017-05-26关于Linux的core dump
  • 2017-05-26[Android学习]ListView显示多种item的处理办法
  • 2017-05-26【同行说技术】Android程序员从小白到大神必读资料汇总(三),android资料汇总
  • 2017-05-26ViewPager与PagerAdapter,viewpager

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • AS400银行核心系统开发中的技术总结--交易和组件写法
    • 再谈Android AsyncTask的优缺点,androidasynctask
    • android 图片加载库 Glide 的使用介绍,
    • androd 获得wifi列表,androdwifi列表
    • Android通过achartengine画折线图,achartengine折线图
    • Android开发学习之路--图表实现(achartengine/MPAndroidChart)之初体验
    • [android] 手机卫士保存密码时进行md5加密,androidmd5
    • android:常用的AlertDialog对话框及自定义对话框
    • Android自动化构建之Ant多渠道打包实践分析(上)
    • 记一次Android系统下解决音频UnderRun问题的过程

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有