初识自定义控件Android应用界面开发

Android应用界面开发

第三章学习

第一部分####


1.继承View类来实现自定义控件####

自定义控件的三种创建形式:

  • 通过继承一个布局文件实现自定义控件。
  • 继承已有的控件来实现自定义控件。
  • 通过继承View类来实现自定义控件。

自定义控件是个大坑,并不能在此以偏概全阐述出它的精髓,笔记仅作为一方面的了解作用。

1.1 通过继承一个布局文件实现自定义控件

知识要点

  • 关于dp、sp、dpi、px、density
  • dp:density-independent pixel,密度(屏幕分辨率)无关像素,非文字的类尺寸推荐用dp
  • sp:scale-independent pixel ,规模无关像素,文字类尺寸推荐用sp
  • px:像素,一般不用,偶尔用1px表示一条线
  • pdi:dots per inch:一英寸多少个像素点,常见取值 120,160,240
  • density:密度,和标准dpi的比例(160px/inc)
  • 提取布局的属性:theme & style ---- 配置 "样式"
  • theme:在manifest.xml中,可用android:theme="@style/AppTheme"属性,替application(整个应用)添加统一的主题,默认主题保存在styles.xml中
  • style:通过添加item,可以将通用的属性提取出来,填在此处,避免每一个新建的部件都重复填写同一属性,如果仍然填写,则覆盖style中同名的属性;style的部署,主要放在values.xml中,而使用时,在view类中添加style=""属性进行配置
    <!--配置style-->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
    <!--使用style-->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:id="@+id/textView"
        style="@style/TextAppearance.AppCompat.Title"/>

只要布局好一个xml文件,在需要使用的时候,仅一句include即可

<include layout="@layout/my_title"/>

可是这种自定义控件,自身没有响应点击等逻辑,需要时只有每次实例化控件,编写java代码来实现,没有复用性,于是有了下面这种更进阶的方式。

1.2 通过继承View类来实现自定义控件

知识要点

  • LayoutInflater
  • 获得View对象: 一般在活动中,要获取mxl中的控件是使用findViewById( )方法,而获取整个xml文件就需要用到LayoutInflater了
  • LayoutInflater:布局填充器,可使用inflate( )方法将xml布局文件转化为View对象,获得LayoutInflater对象有三种方式
  • inflate(int resource, ViewGroup root ):第一个参数是要加载的布局文件的id,第二个参数是给加载好的布局再添加一个父布局

眼见为实,操作如下:

public class TitleLayout extends LinearLayout {

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

//先获得LayoutInflater实例
    LayoutInflater mLayoutInflater = 
    getLayoutInflater();        //方法一
    getSystemService(LAYOUT_INFLATER_SERVICE);    //方法二
    LayoutInflater.from(context);        //方法三
    
//通过inflate()解析布局文件xml
    View view = mLayoutInflater.inflate(R.layout.my_title,null);
    TextView textview = (TextView)view.findViewById(R.id.textview);
    }
}

通过在构造方法中获取自定义部件来实现代码逻辑,完成了一种通用的可相应事件的自定义部件。

还可以重载onDraw()方法,对自定义控件进行绘制,比如:

居中Text三角形

以后学完SurfaceView,还可以制作不使用布局文件,仅继承自View或其子类来实现自定义控件,比如游戏。

围住神经猫

上次跟着教程只做过一个游戏,感兴趣可以在github下载代码来看:github

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏郭霖

Android Scroller完全解析,关于Scroller你所需知道的一切

2016大家新年好!这是今年的第一篇文章,那么应CSDN工作人员的建议,为了能给大家带来更好的阅读体验,我也是将博客换成了宽屏版。另外,作为一个对新鲜事物从来后...

2516
来自专栏james大数据架构

SwitchButton 开关按钮 的多种实现方式

刚开始接触开关样式的按钮是在IOS系统上面,它的切换以及滑动十分帅气,深入人心。 所谓的开关按钮,就是只有2个状态:on和off,下图就是系统IOS 7上开关按...

2767
来自专栏Android机动车

Material Design整理(六)——SearchView及FlexboxLayout

1191
来自专栏Android相关

LinearLayout.onMeasure--事例说明

将LinearLayout中代码Copy了一份存在本地,然后再在里面加了几个子View,打印出来LinearLayout.onMeasure中的那些变量的值

1072
来自专栏青玉伏案

Android开发之自定义组件和接口回调

说到自定义控件不得不提的就是接口回调,在Android开发中接口回调用的还是蛮多的。在这篇博客开始的时候呢,我想聊一下iOS的自定义控件。在iOS中自定义控件的...

21610
来自专栏lzj_learn_note

RecyclerView的一些开源LayoutManager

Google默认为RecyclerView提供了LinearLayoutManager、StaggeredGridLayoutManager、GridLayou...

4753
来自专栏大壮

iOS 动画(理论篇)

1675
来自专栏lzj_learn_note

自定义无限循环ViewPager(二)――ViewPager滑动原理解析

在前面一篇文章中,已经分析了ViewPager初始化的原理,而本篇文章开始分析ViewPager的滑动及页面切换的原理。在阅读本文之前,大家可以先去了解下Scr...

1711
来自专栏jianhuicode

Android的FixScrollView自定义控件

需求模仿腾讯课堂视频播放详情页面,效果如图: 1外层滚动控件到顶部,内层控制滚动 2内层滚动到顶部,外层控制滚动 835108-201703311117091...

2228
来自专栏AndroidTv

View 动画 Animation 运行原理解析

这次想来梳理一下 View 动画也就是补间动画(ScaleAnimation, AlphaAnimation, TranslationAnimation...)...

3785

扫码关注云+社区

领取腾讯云代金券