自定义View精炼详解第(一)课:基础理论部分和简单小实现

一、前期基础知识储备

(1)自定义View的定义:直接使用现有的控件满足不了开发者的需求,比如一些统计用的图表——折线图、柱状图、饼图等等,这些图表直接使用现有的控件是实现不了,那么开发者为了满足万恶的产品经理的需求和可恶的交互设计师的要求,就必须搞定。搞定的方式,就是自己定义好/封装好一个/多个控件,去实现效果。当然,这个实现效果的过程是很有成就感的。

(2)自定义View的方式:现有的自定义View的方式有三种:①继承控件的方式——继承一个现有控件,去实现一个简单的效果;②继承View布局的方式——继承多个现有控件,然后干脆继承整个布局,去实现一个复杂的效果;③继承根View的方式——现有的控件完全无法满足需要,那么开发者就完全需要自定义一个之前不存在的控件。

三个例子帮助读者理解三种自定义View的方式:①某QQ设置页面,其开关控件toggleButton,就是采用了第一种自定义控件的方式;②某QQ空间页面,上面三栏的“好友动态”就是采用了第二种自定义View的方式—ImageView+TextView;③某招商银行的收益页面,采用的就是第三种自定义View的方式,绘制了一个跟整个页面相融合的折线图

                          

(3)自定义View三种方式对比①、②方式对现有的控件进行一定程度的修改可以满足要求,是开发中最常用、最有效、最安全的方式,如果你需要自定义View了,请先考虑这两种方式。③方式完全实现一个从无到有的控件,是开发中一种非常高傲的行为,这个行为会带来荣誉—牛啊、大神啊......但是也会带来后果—bug啊、安全问题啊、效率问题啊......这个道理和使用框架是一样的,现有的控件毕竟是谷歌官方给出的,已经很多开发者在使用了,稳定性和效率都有了很大程度的保证。

4)自定义View的价值①能够做到基础控件无法做到的效果,为应用的表现增色;②在多个应用并行开发的团队,将公用的交互效果提取成自定义控件,方便复用,减少不必要的重复劳动;③将控件的内部逻辑封装在自定义View中,便于应用内解耦;④带来个人成就感,自定义View讲道理确实不简单,开发者如果做出了一个设计、排版、效率兼具的自定义控件,那要兴奋好一段时间。

小结:请重点关注前面两种自定义View的方式——①继承一个现有控件;②继承一个现有布局,即继承多个现有控件,然后做好抽象和封装。

二、上代码,具体实现

以实现第一种方式为例——自定义现有控件—一个提交按钮Button

先上运行效果图:

①未点击     ②点击时

①在drawable文件夹下定义好submit.xml文件,用于定义button状态

<?xml version="1.0" encoding="utf-8"?>  
<selector xmlns:android="http://schemas.android.com/apk/res/android">  
<item android:state_pressed="true"
android:drawable="@drawable/choosed"/> 
<item android:drawable="@drawable/none"/> 
</selector>

②自定义SubmitButton代码段——自定义一个SubmitButton类

package com.example.administrator.uipractice;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.Button;

//自定义提交按钮
public class SubmitButton extends Button {
    public SubmitButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        setBackgroundResource(R.drawable.submit);
        setText("提交");
        setTextSize(18);
    }
}

③Activity布局main_xml代码段——在主布局文件中引入自定义控件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.example.administrator.uipractice.SubmitButton
        android:layout_marginTop="40dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

④MainActivity代码段——加载主布局

package com.example.administrator.uipractice;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity{
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
    }
}
小结:读者看完之后也许会有疑问,怎么这个自定义按钮这么简单,没有 重写属性,没有 重写回调方法,没有实现 事件分发,其实没错,自定义View有很多种,从简单到复杂,开发者要根据实际情况去采用最合适的自定义View方式,本例是第一种自定义View的方式——继承已有控件,也是笔者自定义View的第一课,为的是给读者设立学习的信心,有愿意学习源码的读者,也有喜欢具体例子的读者,毕竟每个开发者处在的阶段不一样。写这么多,就是想设立起读者学习自定义View的信心,大家一起加油!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值