Android开发自定义View之滑动按钮与自定义属性
写博客辛苦了,转载的朋友请标明出处哦,finddreams:(http://blog.csdn.net/finddreams/article/details/40392975)
话不多说,先运行效果图:
谈到自定义View,我们都知道Android系统原生内置不少的View控件,常用的有:
文本控件TextView和EditText,图片控件ImageView,按钮控件 Button和 ImageButton,进度条ProgressBar,单选按钮RadioButton和RadioGroup,复选按钮 CheckBox 等等。
这里有些小细节我们要注意一下,比如说EditText继承自TextView,而TextView是继承View控件,TextView和EditText最大的区别就是前者不可编辑而后者是可以编辑的。
可能很多人不是很明白Button和 ImageButton的区别:
首先,Button控件继承自 TextView 类,ImageButton 继承自 ImageView,他们的继承父类不同。
其次,ImageButton只能显示图片;Button用于显示文字。
最后是相同点,做为按钮控件都可用于响应按钮的点击事件。
系统的控件虽然已经很丰富了,但有时你仍然会觉得原生控件不能够达到你所想要的效果,这时你就会想,能不能自己定义控件呢?答案是肯定的。
通过对android原生控件的研究,我们可以发现android中的控件都是继承View类,如textView、ImageView等,通过重写相关的方法来实现新的效果,通过这个我们得到两点:
1.我们可以在已有控件的基础上,通过重写相关方法来实现我们的需求。
2.继承View类或Viewgroup类,来创建我们所需要的控件。一般来讲,通过继承已有的控件,来自定义控件要简单一点。
下面我就通过一个滑动开关的实例来详细说一下关于自定义控件的步骤:
1、创建类继承View 或View的子类。
- public class SlideSwitchButton extends View
2、创建构造方法:
- public SlideSwitchButton(Context context); // 在代码中new 对象时调用此方法
- public SlideSwitchButton(Context context, AttributeSet attrs); // 在XML布局文件中声明此View,创建对象时,由系统自动调用
- public SlideSwitchButton(Context context, AttributeSet attrs, int defStyle) // 与方法2用法一样,只是多了一个参数:默认样式
- <com.finddreams.slideswitch.SlideSwitchButton
- android:id="@+id/msg_slideSwitch"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="10dip" />
通过如上的步骤即可使用滑动按钮控件了,如果你想要根据滑动开关的不同状态,处理不同的需求,或者说你想自定义滑动开关上左右两边显示的文字,比如说关闭状态时显示已关闭/含,开启状态时显示已开启/不含等等一些反义词。你只需要更改一下下面的代码
- public class MainActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- SlideSwitchButton msgSwitch = (SlideSwitchButton) findViewById(R.id.msg_slideSwitch);
- msgSwitch.setOnSwitchChangedListener(new OnSwitchChangedListener() {
- /**
- * 需要处理的业务需求
- */
- @Override
- public void onSwitchChanged(SlideSwitchButton obj, int status) {
- switch (obj.getId()) {
- case R.id.msg_slideSwitch:
- Toast.makeText(MainActivity.this, "slideSwitch1 状态:" + status, 1).show();
- break;
- default:
- break;
- }
- }
- });
- //可以根据你的项目要求随意定制想要显示的反义词组
- msgSwitch.setText("已开启", "已关闭");
- }
- }
说完自定义的控件,接下来谈谈自定义属性这个看起来高大上的东西,一直都是使用Android系统自带的属性比如说background,id,text等,忽然说能自定义属性,感觉还是满厉害的。那在真实的商业项目中,自定义属性用的到底多不多呢?很明确的告诉你不多,虽然自定义属性做起来并不难,但是不够实用。当然了如果你能做自定义属性的话,那样给人的感觉很高大上,很正规。话不多说,以为滑动开关控件加上自定义属性为例:
1.你需要在values目录下面新建一个名为attrs,其实这个名字是可以任意起的,并不是说取了其他的文件名Android系统就不认识,不过出于规范通常把属性文件命名为attrs。
2. 首先在attrs.xml文件中声明可用属性集的名称,然后在属性集中声明属性,有属性名:name和格式:format 。
- <!-- 声名属性集的名称 -->
- <declare-styleable name="slideswitchbtn">
- <!-- 声名一个属性 name是bg_switch_off 类型为 引用类型 引用资源ID -->
- <attr name="bg_switch_off" format="reference" />
- <!-- 声名一个属性 name是bg_switch_on 类型为 引用类型 引用资源ID -->
- <attr name="bg_switch_on" format="reference" />
- <!-- 声名一个属性 name是switch_thumb 类型为 boolean 类型-->
- <attr name="switch_thumb" format="reference" />
- </declare-styleable>
注意:format 的常用类型有
reference 引用
color 颜色
boolean 布尔值
dimension 尺寸值
float 浮点值
integer 整型值
string 字符串
enum 布尔值
3.在布局文件中使用:在使用之前必须声名命名空间,xmlns:dreams="http://schemas.android.com/apk/res/com.finddreams.slideswitch"
说明:xmlns 是XML name space xml的命名空间的缩写;
dreams可为任意写符
http://schemas.android.com/apk/res/ 此为android固定格式,必须这样写
com.finddreams.slideswitch 此应用的包名,如manifest配置文件中package包名一致。
- </pre><pre name="code" class="html"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:dreams="http://schemas.android.com/apk/res/com.finddreams.slideswitch"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- tools:context=".MainActivity" >
- <com.finddreams.slideswitch.AttrSlideSwitchButton
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="10dip"
- dreams:bg_switch_off="@drawable/bg_switch_off"
- dreams:bg_switch_on="@drawable/bg_switch_on"
- dreams:switch_thumb="@drawable/switch_thumb" />
4.通过在自定义view的第二个和第三个构造方法当中,通过解析 AttributeSet 对象,获得所需要的属性值。
- //获得自定义的属性
- TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.slideswitchbtn);
- int N = ta.getIndexCount();
- for (int i = 0; i < N; i++) {
- /*
- * 获得某个属性的ID值
- */
- int itemId = ta.getIndex(i);
- switch (itemId) {
- case R.styleable.slideswitchbtn_bg_switch_off:
- //id默认是-1,如果没有找到相关的id就跑出异常
- mSwitch_off = ta.getResourceId(itemId, -1);
- if(mSwitch_off == -1){
- throw new RuntimeException("请设置关闭图片");
- }
- mSwitch_off_Bit=BitmapFactory.decodeResource(resources, ta.getResourceId(itemId, -1));
- break;
- case R.styleable.slideswitchbtn_bg_switch_on:
- mSwitch_on = ta.getResourceId(itemId, -1);
- if(mSwitch_on == -1){
- throw new RuntimeException("请设置打开图片");
- }
- mSwitch_on_Bit = BitmapFactory.decodeResource(getResources(), mSwitch_on);
- mBmpWidth = mSwitch_on_Bit.getWidth();
- mBmpHeight = mSwitch_on_Bit.getHeight();
- break;
- case R.styleable.slideswitchbtn_switch_thumb:
- mSwitch_thumb = ta.getResourceId(itemId, -1);
- if(mSwitch_on == -1){
- throw new RuntimeException("请设置滑动条");
- }
- mSwitch_thumb_Bit = BitmapFactory.decodeResource(getResources(), mSwitch_thumb);
- mThumbWidth = mSwitch_thumb_Bit.getWidth();
- break;
- default:
- break;
- }
- }
- }
5.通过以上的步骤就可以使用自定义属性了,同样的效果两种不同的实现方式,不适用自定义属性会比使用自定义属性要方便,没那么麻烦,但是会让人感觉很正规,符合Android的规范。下面上项目源码,有需要的朋友可以下载看看。http://download.csdn.net/detail/finddreams/8071641
Android开发自定义View之滑动按钮与自定义属性相关推荐
- android开发自定义View(三)仿芝麻信用积分
此文参考了https://github.com/HotBitmapGG/CreditSesameRingView 感谢作者的分享!! 首先看一下支付宝上显示的样子 然后看一下模仿的效果 代码 基础部分 ...
- Android开发自定义View
Android中View组件的作用类似于Swing变成中的JPanel,它只是一个空白的矩形区域,View组件中没有任何内容.对于Android应用的其他UI组件来说,它们都继承了View组件,然后在 ...
- Android开发自定义View实现数字与图片无缝切换的2048
本博客地址:http://blog.csdn.net/talentclass_ctt/article/details/51952378 最近在学自定义View,无意中看到鸿洋大神以前写过的2048(附 ...
- Android开发自定义View之仿米家APP双色灯控制UI:做一个智能家居产品的简单智能灯UI !(附带Demo)
一. 前言: 兜兜转转,不知不觉做Android开发已经快2年了,上半年一直在搞wifi模块开发,导致不务正业,写个自定义UI还要折腾半天,真是对不起自己的良心了!最近要对接小米开放平台,不小心看到了 ...
- android仿苹果滑动,Android开发仿IOS的滑动按钮
释放双眼,带上耳机,听听看~! 项目结构 MainActivity public class MainActivity extends AppCompatActivity { @Override pr ...
- android开发自定义View(四)仿掌上英雄联盟能力值分析效果
本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 原始图效果 模仿效果 PNG GIF 流程 绘制中心线,用于计算外层多边形各点的坐标 绘制最外层多边形 分析原型图算出每个多边形之间 ...
- android设置自定义按钮,Android自定义View之元素按钮
Android自定义View之元素按钮 之前在dribbble看到的三个元素的按钮,参考了设计的创意,添加了自己定义的动画效果来实现.先看效果 效果图 分别是水火电三个元素的按钮实现.其中电的实现最简 ...
- Android开发——自定义炫酷PickerView惯性滚动魔改
Android开发--自定义炫酷PickerView快速滚动魔改 最近由于课内压力的增加和安卓课设项目,故没有怎么刷acm题,基本上学校要训练也就去水一波,程序设计相关内容也鸽了. 由于从来没有做过开 ...
- Android开发自定义UI组件
Android开发自定义UI组件实现红色小球跟随手指移动 要写实现自定义UI组件,要创建一个BallView类,继承View类,在BallView类中创建画笔,然后重写OnDraw()方法和OnTou ...
最新文章
- Watir-webdriver处理table
- R Learnilng 十八讲13-17
- 计算机领域中的牛人,计算机视觉领域的牛人 | 丕子
- 关于“ModuleNotFoundError: No module named ‘flask._compat‘”的解决
- flask开发问题小记
- 【腾讯面试题】MySQL常用数据库引擎
- python升级pip怎么出错了_Python,开启吐槽模式,新手必看!
- 蓝桥练习-算法训练 P0505
- python tcp协议_python 网络编程 -- Tcp协议
- Java文件类boolean isDirectory()方法(带示例)
- 计算机辅助小学数学教学的研究,计算机辅助数学教学的研究
- python_魔法方法(二):算术运算
- 多进程,守护进程,锁
- 无法更新标识列 wechatid_天津塘沽企业标识标牌设计制作安装的过程
- php soap wsse,改变xmlns:wsse命名空间在使用Python Zeep的SOAP请求中
- 深度剖析Java集合之Stack
- (13) IFC格式说明 (Industry Foundation Class)
- 阿里巴巴 面试 java_阿里巴巴面试经验
- android 显示进度,progressdialog-如何在Android中显示进度对话框?
- sql server线程等待信息
热门文章
- mysql数据库进阶_MYSQL数据库进阶操作
- .net mysql limit 分页原理_浅谈MySQL分页Limit的性能问题
- php编写一个计算相对路径的函数,php求相对路径的函数
- 字节跳动学前端还是java_【全国】—Java/前端工程师—字节跳动
- Vue3+Cli4 中使用 Echarts 5
- php 设置cors,php – 启用cors在.htaccess
- sed shell 替换空格_shell三剑客之sed!
- 导出csv文件_使用 WeihanLi.Npoi 操作 CSV
- iphonex售价_苹果将发电竞笔记本,售价3.5w起!
- Android百度SDK定位