Android自定义控件系列案例【一】

(3)Android常见界面控件 文章目录3.1 简单控件的使用3.1.1 TextView控件3.1.2 EditText控件3.1.3 Button控件方法一:布局文件中指定点击事件(不常用)方法二:使用内部匿名类实现点击事件方法三:使用Activity实现OnClickListener接口全部实现代码举例3.1.4 ImageView控件3.1.5 RadioButton控件设置监听事件3.1.6 CheckBox控件代码举例3.1.7 Toast类3.1.8 实战演练—实现注册界面效果创建样式放置界面控件实现注册功能示例图3.2 阅读详情

Android自定义控件的重要性就不多说了,总之是技术进阶,面试常见,高薪必备。

本篇博文的目的很简单,就是希望通过自定义控件来解决一个常见需求点,从而感受一下自定义控件的魅力与强大。

案例描述:

有一张正方形图片,希望在屏幕上还以正方形,并且不会出现变形,与此同时,希望图片的宽正好是屏幕的宽。

案例效果:

       

案例实现:

方式一: 使用ImageView来显示图片

要显示一张图片,首先我们就会想到使用Android自身的控件ImageView。而需求点要求图片显示的宽要和屏幕的宽一样,所以ImageView的宽我们自然使用android:layout_width="match_parent",这样显示的图片宽就会随着设备屏幕的宽自适应。宽确定了之后,我们来确定高,因为图片的高我们布局的时候不一定知道,所以不能定死了(比如100dp,200dp等),那这样我们就只有两个选择,一是填充父布局,让ImageView的高与父布局一样高( android:layout_height="match_parent"),二是包裹内容,让ImageView的高与图片一样高,(android:layout_height="wrap_content"),第二种理论上应该是我们想要的,接下来我们看看分别使用match_parent和wrap_content确定高之后的效果:



显示这两种都有变形的情况,且math_parent肯定不行,而wrap_content时,虽有变形,但是这个时候肯定有人想到ImageView控件有个属性scaleType,它可以对ImageView上要显示的图片进行缩放,裁剪等操作。下面是一个使用此属性的效果:
 (1)android:scaleType="matrix"
缩放类型为matrix时,图片无变形,但显示宽度与设备宽不一致。
(2)android:scaleType="fitXY"
缩放类型为fitXY时,图片宽虽与设备宽一致,但水平拉伸了。
(3)android:scaleType="fitStart"
缩放类型为fitStart时,图片无变形,但显示宽度与设备宽不一致。
(4)android:scaleType="fitCenter"
缩放类型为fitCenter时,图片无变形,但显示宽度与设备宽不一致。
(5)android:scaleType="fitEnd"
缩放类型为fitEnd时,图片无变形,但显示宽度与设备宽不一致。
(6)android:scaleType="Center"
缩放类型为Center时,图片无变形,但显示宽度与设备宽不一致。
(7)android:scaleType="CenterCrop"
缩放类型为CenterCrop时,无变形,宽一致,但上下部分被裁剪了。
(8)android:scaleType="CenterInside"
缩放类型为CenterInside时,图片无变形,但显示宽度与设备宽不一致。

上面把ImageView的ScaleType中的所有情况都测试了一遍,都不能满足我们的需求,在这种情况下,我们不得不放弃使用Android原生态控件来满足需求了,这也就正是Android自定控件要解决的问题。

方式二:使用自定义控件来显示图片

自定义控件有完全自定义、组合自定义、基于原生态控件自定义这几种常用的方式,分析我们的需求本质问题还是要显示一张图片,所以我们采用基于原生态显示图片的控件ImageView进行定制,从方式一我们发现,使用ImageView不能实现不变形且图片宽与屏幕宽一致的统一,所以自定义控件的目的就是要解决这个统一问题。明白了自定义控件我解决的问题,接下来就来进行定制。

(1)首先创建一个类MyImageView,继承于ImageView:
package com.kedi.mylayout;

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

public class MyImageView extends ImageView{

	

}

(2)重写父类构造方法:

一般需要实现三个(一参、二参、三参),并且为了方便管理构造方法,我们改一参构造方法调用二参,二参调三参,然后如果有初始化逻辑,我们统一写在三参构造方法中。
package com.kedi.mylayout;

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

public class MyImageView extends ImageView {
	public MyImageView(Context context) {
		this(context,null);	
		
	}
	public MyImageView(Context context, AttributeSet attrs) {
		this(context,attrs,0);
	}
	public MyImageView(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs,defStyleAttr);
	}	

}

(3)实现自定义控件要解决的问题:

       接下来就是写自定义控件要解决的问题了,根据要解决的问题可以需要重写的方法不一样,比如onMeasure()、onLayout()、onDraw()、onFinishInflate()、onSizeChanged()、onInterceptTouchEvent()、onTouchEvent()等。就当前需求而言,我们要解决的是图片显示的宽高之类问题,所以需要重写onMeasure()方法,这个方法是由布局测量宽高大小并建议子控件使用,用来确定或修改子控件的大小。
package com.kedi.mylayout;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ImageView;
import android.widget.RelativeLayout;

public class MyImageView extends ImageView{
	public MyImageView(Context context) {
		this(context,null);
		
		
	}
	public MyImageView(Context context, AttributeSet attrs) {
		this(context,attrs,0);
	}
	public MyImageView(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs,defStyleAttr);
	}
	
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		
	}

	

}

为了让自定义控件的宽高一样,并且宽要和设备宽一致,我们可以让它的父布局宽高为march_parent,让父布局宽适应设备的宽,这样在onMeasure()方法中,父布局就会推荐自定义控件的宽为父布局的宽,也就是设备的宽,然后我们再通过setMeasuredDimension(width, width);方法,让自定义控件的宽高一样。从而实现了要解决的问题。

package com.kedi.mylayout;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ImageView;
import android.widget.RelativeLayout;
/**
 * 自定义控件
 * @author 张科勇
 *
 */
public class MyImageView extends RelativeLayout {
	public MyImageView(Context context) {
		this(context,null);
		
		
	}
	public MyImageView(Context context, AttributeSet attrs) {
		this(context,attrs,0);
	}
	public MyImageView(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs,defStyleAttr);
	}
	
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
	<span style="color:#ff0000;">	//获取父布局推荐的宽高,并把小者作为自定义控件的宽高
		int width = Math.min(getMeasuredWidth(), getMeasuredHeight());
		//将自定义控件的宽高设置成父布局推荐的宽
		setMeasuredDimension(width, width);</span>
	}

	

}

(4)使用自定义控件布局:

使用自定控件布局与Android原生态控件布局没什么区别,唯一需要注意的是自定义控件在使用的时候需要加类全名(包名+类名)。需要注意的是自己在使用自定控件布局的时候记得把这个包名换成自己的包名和类名。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <span style="color:#ff0000;"><com.kedi.mylayout.MyImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerInParent="true"
        android:background="@drawable/pic" >
    </com.kedi.mylayout.MyImageView></span>

</RelativeLayout>
运行程序,效果如下图:

我们可以看到使用自定义控件确定解决了使用方式一时出现的变形和宽高问题,这就是自定义控件的强大和灵活。但自定控件容易入门,难于精通,需要我们不断积累才能够运用自如。
 读完本篇,可能会有点感觉,但如想进一步学习自定义布局,自定义属性的案例可以阅读Android自定义控件系列案例【二】



【安卓自定义控件系列】安卓自定义控件之组合控件 在安卓开发中,谷歌已经为我们提供了许多原生控件,基本上能够满足我们日常的开发需求,但是某些项目中原生控件可能达不到产品所要求的各式各样的酷炫效果或功能效果,这个时候我们只能自己自定义控件来满足项目需求,我们知道自定义控件包括三种方式: 1继承控件,即继承谷歌提供的原生控件,在此基础上提供一些原生控件不具备的功能,如github上各种酷炫效果的开源组件基本上都是采用的这种方式. 2组合控件:即组 阅读详情

相关推荐

Android自定义控件系列案例【三】

自定义控件的目的有很多,比如系统控件满足不了需求时,我们会想到通过自定义控件来满足需求。其实有的时候为了功能的复用我们也会去自定义控件,把经常要用的或以后要用的与UI相关的功能封装到自定义控件中,让它成为独立的功能,当然为了灵活的控制其中的可变部分,自定义的控件应该预留接口(这里说的接口不是Java中的Interface,是控制可变部分的方式,比如方法之类的)

kedi_study的博客 1374

[Android开发基础2] 七大常用界面控件(附综合案例)

安卓开发常用界面控件使用介绍,包括TextView、Button、EditText、ImageView、RadioButton、CheckBox、Toast,最后附带一个综合案例:账号注册界面加一巩固

人生处处是围城,一切都是最好的安排! 8658

Android自定义列表(ListView)

实现自定义的listView,学习图文混排技术,有助于理清思路

android自定义控件教程,Android自定义控件样式实例详解

本文实例讲述了Android自定义控件样式的方法。分享给大家供大家参考,具体如下:Android控件样式自定义是用定义在drawable文件夹下的XML文件实现,在布局文件中通过设置控件的background属性达到效果。一、控件常见状态:在XML文件中用到了selector节点,selector可以理解为状态切换器,不同的状态下切换不同的样式,各种状态用Item节点表示,以下为一些常见的状态(注...

weixin_33186395的博客 501

安卓常用控件例子集合

安卓常用控件例子集合,非常适合刚刚入门的人,常用的控件都集成在一起,方便查看使用

Android中采用ListView实现数据列表显示案例

Android中采用ListView实现数据列表显示案例!

Android自定义控件

通常开发Android应用程序的界面时,都不直接使用View控件,而是使用View控件的子类。例如,如果要显示一段文字,可以使用View控件的子类TextView控件;如果要显示一个按钮,可以使用View控件的子类Button控件。虽然Android提供了很多继承自View类的控件,但是在实际开发中,还会出现不满足需求的情况,此时我们可以通过自定义控件的方式实现。最简单的自定义控件就是创建一个继承View或其子类的类,并重写该类的构造方法。

m0_57150356的博客 1411

android 常用控件实例23个demo

android 常用控件实例23个demo,把这个例子看懂了,书基本不用看了,平时用的控件都在里面,非常适合新手学习。

Android中级——自定义控件实现

当子View上拉超过一定距离,松开后自动滑到下一个子View,下滑同理,布局如下

松仔Log的博客 655

Android自定义控件LinearLayout实例讲解

很多时候Android常用的控件不能满足我们的需求,那么我们就需要自定义一个控件了。今天做了一个自定义控件的实例,来分享下。 首先定义一个layout实现按钮内部布局:  <?xmlversion=1.0encoding=utf-8?> <LinearLayoutxmlns:android=http://schemas.android.com/apk/res/android android:layout_width=fill_parent android:layout_height=fill_parent android:orientation=horizont

网络摄像机Sensor低光性能实测:海思平台搭配索尼IMX335 vs 豪威OV4689

本文通过海思Hi3516DV300平台,对索尼IMX335与豪威OV4689两款网络摄像机Sensor进行低光性能实测。在信噪比、动态范围及实景成像对比中,IMX335凭借更优的噪声控制与稳定性表现领先,尤其在极低光环境下优势明显。文章为安防监控项目的Sensor选型与海思平台优化提供了数据参考与实战建议。

silver的专栏 829

Android自定义控件系列——自定义组合控件案例

自定义控件 自定义组合控件 1 创建自定义布局view_combination.xm,指定text的id值 2 创建自定义属性attrs.xml中的resource节点下 &amp;amp;lt;declare-styleable name=&amp;quot;MyView&amp;quot;&amp;amp;gt; //指定MyView为自定义属性名 //设置文本,format的类型见Andrid提示,注意大小写 &amp;amp;lt;attr na

mLuoya的博客 6287

CYUSB3065配置CMOS

按照OG02B10的时序电路,在通过SCCB配置CMOS之前,需要三个电源上电,Xshutdown高电平和配置时钟电路。找到手册的第6章SCCB(跟IIC很像),可以看到SCCB的地址与SID引脚有关,这个需要到硬件原理图上确认下。这是Cypress的一个支持MIPI和UVC的模块,有例程支持OV5640,现在要替换替换成OG02B10。寄存器参数需要找到厂家的FAE,由他们提供,OG02B10的资料已经上传。(2)参考得宏的电路,时钟由主控提供,目前程序未实现。这里有两个重要参数需要搞定,摄像头的。

qq_40773212的博客 2945

Android自定义控件(一)

Android中提供的控件基本可以满足我们日常开发的需求,但是有些需求只凭这里控件的组合并不能满足,我们可以通过写自定义控件来实现各种功能的控件,比如QQ消息右上角红色提示框水波式消失效果。本篇将对Android自定义控件进行基本的讲解,后面还会持续更新。 自定义控件要求: 1. 应当遵守Android标准的规范(命名,可配置,事件处理等)。 2. 在XML布局中可配置控件的...

yuanheng19930119的博客 1万+

【学习笔记】人群归因分数 PAF 以及combined PAF(更新)

在此推荐2篇发表在lancet以及jama子刊上的paf文章,这两篇文章套路是一样的,只是在不同国家进行。希望对大家学习PAF有所帮助,后面有新内容也会继续分享,也欢迎大家分享使用R语言计算PAF的经验~~~的时候,先建立了相关矩阵,再做主成分分析,得到communality。详细信息大家可翻阅原文。

weixin_53499537的博客 1497

元数据管理:DataHub和OpenMetadata对比分析

DataHub和OpenMetadata都试图解决数据编目,搜索,发现,治理和质量方面的相同问题。这两种工具都是出于为需要支持大量数据源、团队和用例的大型组织解决这些问题而诞生的。尽管这些工具在发布历史和成熟度方面略有不同,但它们的功能存在显着重叠。

weixin_38030820的博客 6632

Android UI 自定义控件大全

很多东西的实用性还是蛮高的,转载让更多人看到。 原文链接: https://github.com/opendigg/awesome-github-android-ui 内容 抽屉菜单 ListView WebView SwitchButton 按钮 点赞按钮 进度条 TabLayout 图标 下拉刷新 ViewPager 图表(Chart) 菜单(M...

晨曦 4496

别再为GEE注册发愁了!用谷歌Cloud Project,5分钟搞定谷歌地球引擎账户(保姆级图文)

本文提供2024最新版谷歌地球引擎(GEE)账户注册的保姆级教程,通过谷歌Cloud Project快速完成注册,5分钟极速通关。详细解析注册前的准备、分步图解流程、常见误区及解决方案,帮助用户避开90%的注册陷阱,直达GEE核心功能区。

weixin_42557830的博客 200

Android自定义控件开发系列(一)——第一次动手做自定义控件

Android系统提供的控件多种多样,以至于很多初学者经常忘了还有这样那样的控件没用过甚至没听过。尽管如此,但是系统控件大多比较死板,而且不够美观,很多多样化的显示或是交互方式都没法完成。每每遇到这种情况,就需要我们来开发我们自己的控件了——所谓的“自定义控件”。接下来我们就一步一步扎扎实实的从头开始Android自定义控件的开发。

衷水木先生的博客 6888

浅谈IC测试向量(pattern)及其转换

随着集成电路的飞速发展,其规模越来越大,对电路的质量与可靠性要求进一步提高,集成电路的测试方法也变得越来越困难,为了实现芯片的快速测试和筛选,ATE设备为其提供了强有力的支撑。ATE运用芯片设计仿真文件,将其作为芯片输入激励,通过ATE测试平台提供芯片测试环境,将芯片的输出和测试结果进行比较,以此来判定芯片的好坏。 说起IC测试,不得不说一下Pattern这个词,它中文的意思是模式。在图像处理中,这个词意思为图像的纹理特征,而在IC也即芯片测试行业,这个词实际上代表了需要测试芯片的时序特征。简单的说,在测

flomingo1的专栏 1万+

【WLAN】【调试】再谈如何使用Wireshark解密WiFi数据包——使用TK信息

- 本文介绍了一种wireshark使用TK信息解密空口报文的方式,该方式对是否有关联过程的报文没有要求。

一介草民,只为生活。 1188

Android自定义控件系列案例【五】

在开发银行相关客户端的时候或者开发在线支付相关客户端的时候经常要求用户绑定银行卡,其中银行卡号一般需要空格分隔显示,最常见的就是每4位数以空格进行分隔,以方便用户实时比对自己输入的卡号是否正确。当产品经理或UI设计师把这样的需求拿给我们的时候,我们的大脑会马上告诉我们Android中有个EditText控件可以用来输入卡号,但好像没见过可以分隔显示的属性或方法啊。当我们睁大眼睛对着效果图正发呆的时候,突然发现当用户输入内容的时候还出现了清除图标,点击清空图标还可以清空用户输入的内容。 本案例将带大家解决银

kedi_study的博客 2033

点云焊缝提取

本文介绍了一个基于PCL库的点云处理流程,包含三个核心模块:MLS平滑处理通过多项式拟合修正点云位置;差异提取通过双向匹配定位源/目标点云的非重叠区域;统计过滤剔除离群噪声点。该流程采用"平滑-筛选-净化"的通用思路,将复杂算法封装为可配置接口,实现了工业级点云预处理。文章重点分析了各模块的原理、PCL接口调用及参数设计逻辑,同时指出参数调优、算法扩展等深入探索方向,展现了PCL在点云处理中的模块化优势与实用价值。

weixin_45196569的博客 250

【安卓自定义控件系列】自绘控件打造界面超炫功能超强的圆形进度条

在前面我们讲过了安卓自定义控件三种方式中的组合控件,现在我们来讲解一下通过自绘的方式来实现自定义控件,本博客将以自定义圆形进度条为例向大家讲解自定义控件的知识,首先来看一下效果图吧,这个是本人自定义圆形进度条demo工程的运行截图: 首先说一下自己这个自定义圆形进度条要达到的目标: 1能够支持设置进度条各种属性,如圆环的大小,颜色,进度条的大小,颜色,进度条的颜色支持设置三种颜

(* ̄︶ ̄) 5800

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Android自定义控件_安卓自定义控件

MeasureSpec是View的内部类,它封装了一个View的尺寸,在onMeasure()当中会根据这个MeasureSpec的值来确定View的宽高。自定义View在Android的开发中的重要性还是很大的,因为仅仅靠系统提供的控件和组件,无论是美观度还是使用度,再或者是新特性上,都无法满足特定的业务场景。layout()过程,对于View来说用来计算View的位置参数,对于ViewGroup来说,除了要测量自身位置,还需要测量子View的位置。这里我们介绍最复杂的一种,自定义View。

xiaoqi6的博客 957

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: Android图片切片控制与显示案例实战
下一篇: Android自定义控件系列案例【二】
张科勇
博客等级 码龄11年 46粉丝 26原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值