android实现自定义控件及如何在其他项目中使用

Android自定义控件】Kotlin实现滚动效果的数字加减控件 本篇文章所实现自定义效果难度并不大,自定义ViewGroup、使用,结合View的方法实现数字滚动效果。 阅读详情

自定义控件

当android提供的控件不满足需求时, 我们需要自己去定制所需要的控件. 例如在一个TV项目中, 我们需要一种button, 当不选择时, 文本颜色是白色, 当选中时, 文本颜色是黑色, 这时android中自带的button是无法实现的, 那么我们需要去自己定制这种控件.


自定义控件的步骤一般分为:

(1). 声明一个view对象, 继承相对布局,或者线性布局或者其他的ViewGroup.

(2). 在自定义的View对象的构造方法里面就把布局都初始化完毕.

(3). 根据需求, 扩展自定义控件.


根据需求我们去实现改变文本颜色的button, 命名为DButton, 首先:

1设置自定属性

在 value 目录下创建 名为 attrs.xml文件, 在此文件中声明自定义的属性

<?xml version="1.0" encoding="utf-8" ?>
<resources>

    <declare-styleable name="DButton">
        <attr name="normalColor" format="reference|color" />
        <attr name="selectedColor" format="reference|color" />
        <attr name="text" format="reference|string" />
        <attr name="textSize" format="dimension" />
    </declare-styleable>

</resources>
通过normalColor属性来设置button没有选中时的文本颜色, selectedColor属性来设置button选中时的文本状态.

关于format属性有:

dimension 尺寸值

reference  资源ID

color          颜色值

boolean    布尔值

float           浮点值

integer     整型值

string       字符串

enum       枚举值

flag          位或运算

这些属性可以组合使用, 例如上面的 format="reference | color"


2. 创建DButton对象, 继承LinearLayout

public class DButton extends LinearLayout {

    private TextView mTextView;
    private Context mContext = null;
    private int mNormalColor;
    private int mSelectedColor;


    public DButton(Context context) {
        super(context);
        initController(context);
        setGravity(Gravity.CENTER);

        LayoutParams params = new LayoutParams(R.dimen.ltbutton_default_width, R.dimen.ltbutton_default_height);
        setLayoutParams(params);
    }

    public DButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initController(context);
        setAttributeSet(attrs);
    }

    public DButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        initController(context);
        setAttributeSet(attrs);
    }

    private void initController(Context context) {
        mContext = context;
        mNormalColor = Color.WHITE;
        mSelectedColor = Color.BLACK;

        mTextView = new TextView(context);
        mTextView.setTextColor(mNormalColor);
        addView(mTextView);
        setProperty();
        setFocusDrawer(getResources().getDrawable(R.drawable.focus_1));
    }

    private void setProperty() {
        setFocusable(true);
        setFocusableInTouchMode(true);
    }

    private void setAttributeSet(AttributeSet attrs) {
        TypedArray typeArray = mContext.obtainStyledAttributes(attrs, R.styleable.DButton);
        final String text = typeArray.getString(R.styleable.DButton_text);
        if (!TextUtils.isEmpty(text)) {
            setText(text);
        }
        final int normalColor = typeArray.getColor(R.styleable.DButton_normalColor, Color.WHITE);
        if (normalColor != Color.WHITE) {
            mNormalColor = normalColor;
            setTextColor(mNormalColor);
        }
        final int selectColor = typeArray.getColor(R.styleable.DButton_selectedColor, Color.BLACK);
        if (selectColor != Color.BLACK) {
            mSelectedColor = selectColor;
        }
        final int size = typeArray.getDimensionPixelOffset(R.styleable.DButton_textSize, 0);
        if (size != 0) {
            setTextSize(size);
        }

        typeArray.recycle();
    }

    public void setTextColor(int color) {
        mTextView.setTextColor(color);
    }

    public void setTextSize(float size) {
        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
    }

    public void setText(String text) {
        mTextView.setText(text);
    }

    @Override
    protected void onFocusChanged(boolean gainFocus, int direction,
            Rect previouslyFocusedRect) {
        int color = isFocused() ? mSelectedColor : mNormalColor;
        mTextView.setTextColor(color);

        super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
    }
}

这段代码主要是重写onFocusChanged方法, 来实现选中与不选中时控制文本颜色.

在setAttributeSet方法中调用 obtainStyledAttributes获取attrs中的属性, 存入到typearray数组容器中.当操作完需要调用recycle()方法来实现回收.

这样就能解析自定义控件的属性设置, 来进行后续操作, 在这里去获取两种color, 设置button的text与textsize.

3. 使用自定义控件

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

    <com.example.DButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        custom:text="DButton" />

</LinearLayout>
声明自定义空间  xmlns:custom="http://schemas.android.com/apk/res/custom“ 使用自定义控件属性。下面会说道在其他项目中使用自定义控件的声明定义空间不太一样。

至此, 自定义控件实现完成.


如何在其他工程中使用自定义控件?

1. 在eclipse(或ADT)中

(1) 通过jar包的方式

     将自定义控件工程打成jar包, 然后将此jar包copy到引用的工程的libs目录下, 这时候需要注意:(当你的自定义控件引用了资源文件,需要将这些资源文件copy一份到引用控件的工程中. 例如DButton中使用了focus_1的图片作为DButton的背景, 那么这个时候我们再去使用DButton控件时, 需要将图片资源和attrs.xml复制到引用工程中).

     在xml中去使用DButton控件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res-auto/custom"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#999999"
    android:orientation="vertical"
    tools:ignore="ResAuto">

    <com.example.DButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        custom:text="DButton" />

</LinearLayout>

使用 xmlns:custom="http://schemas.android.com/apk/res-auto/custom"来加载命名空间, 这时候会报错, 需要加上tools:ignore="ResAuto" 来忽视错误.

(2) 通过library方式

如果不想将资源文件和attrs.xml复制到工程中, 将自定义控件作为library来进行编译, 在引用工程中去add这个library.

将项目作为library:

选中项目, 右键-->properties->android->选中is library--> 点击确定. 此时项目作为library.

引用项目使用自定义控件:

1).选中项目, 右键-->properties->android->在is library下有add按钮去添加library, 点击add选中自定义控件library.

2).在项目的配置文件中增加:android.library.reference.1=../library的名字

注意: 引入的project需要与当前使用项目统一目录,而且R文件会生成在当前项目中,要避免资源重名

接下来使用自定义控件方式和上面一样.


2. 在android studio中

android studio提供一种类似jar包的方式, aar包.通过aar包我们也不需要将资源文件与attrs文件copy到引用工程中.

生成aar包需要将项目作为android library, 所以如果想使用aar包, 需要在android studio中创建一个moudle(其实就是eclipse中的project) 作为android library, 然后再把代码移植到这里, 然后编译出aar包, aar包在build-->outputs-->aar目录下.

使用aar包:

(1) 把打好的aar包copy到引用的工程libs目录下

(2) 修改Android studio的gradle设置

 添加下面代码

repositories{
   flatDir{
        dirs 'libs'
   }
}
并且在dependencies中导入arr包

repositories {
    flatDir {
        dirs 'libs'
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.3.0'
    compile(name: 'app', ext: 'aar')  //导入名为app的aar包
}

接下来就可以使用自定义控件了, 使用方法和在eclipse中一样.




Android View体系(十)自定义组合控件 上一篇我们讲到了自定义View,接着我们来讲讲常用的自定义组合控件自定义组合控件就是多个控件组合起来成为一个新的控件,主要用来解决多次重复的使用同一类型的布局。比如我们应用的顶部的标题栏,还有弹出的固定样式的dialog,这些都是常用的,所以把他们所需要的控件组合起来重新定义成一个新的控件 阅读详情

相关推荐

安卓自定义日历滑动的日历控件

安卓自定义日历滑动的日历控件标签(空格分隔): 安卓最近公司项目需要做这个需求,自己才疏学浅,总算能写出个大概来,遂在这里记录下来。分析先来分析一下: 首先,我们的需求是可以左右点击查看跳转到下一个月,中间的日历控件可以水平滚动选择日期,所以我们中间的日历控件一个RecycleView来做,左右两位的为ImageVeiw。 LRCalendarView 总体流程: 编写LRCalendarVi

牛仔面包 3958

Android安卓常用控件使用方法

我们使用android:gravity来指定文字的对齐方式,可选值有top、bottom、left、right、center等,可以用“|”来同时指定多个值,这里我们指定的center,效果等同于center_vertical|center_horizontal,表示文字在垂直和水平方向都居中对齐。AlertDialog可以在当前的界面弹出一个对话框,这个对话框是置顶于所有界面元素之上的,能够屏蔽掉其他控件的交互能力,因此AlertDialog一般都是用于提示一些非常重要的内容或者警告信息。

weixin_57244464的博客 761

android布局复用 & 自定义控件

android中View的概念非常重要,它是用户和手机交互的桥梁,就是说android手机向用户展示的界面内容、你向手机输入的内容的这个交互过程是通过View来实现的。android的布局是在View的基础上建立起来的,这个概念简单理解就是多个控件组成一个布局,布局又可以相互嵌套,就可以编写出丰富多彩的界面了。        布局复用:  如果你对android的基础控键(TextVeiw,Ed

joladu的博客 2939

android自定义控件类型,Android 自定义控件实现 (多行选择条)

一、实现思路(如何实现?)二、读源码:TabLayout三、自定义实现主要过程四、该页面其他一些相关问题(Fragment销毁后RadioGroup恢复)五、小结虽然Android提供了一套GUI库,里面有很多控件,但是很多时候我们并不满足于系统的控件,通过自定义view,我们可以实现各种五花八门的效果,但是自定义控件有一定难度,尤其是复杂的自定义控件。在云阅读新版本(5.4.3)中,交互需要实现...

weixin_39623350的博客 341

android 自定义布局 根据布局获取类,Android自定义流式布局的实现示例

在日常的app使用中,我们会在android 的app中看见 热门标签等自动换行的流式布局,今天,我们就来看看如何自定义一个类似热门标签那样的流式布局。下面我们就来详细介绍流式布局的应用特点以及用的的技术点。1.流式布局的特点以及应用场景特点:当上面一行的空间不够容纳新的TextView时候,才开辟下一行的空间。原理图:场景:主要用于关键词搜索或者热门标签等场景2.自定义ViewGroup(1)o...

weixin_42303461的博客 435

android自定义样式设计界面,Android自定义多功能样式Dialog

最近业务需要Dialog,可以显示图标,或者标题,按钮只显示一个或者2个,为了适应需求自定义一个Dialog以满足需求。效果如下:带图片无标题的单个按钮对话框有标题不带图片的对话框先定义Dialog样式:@android:color/transparenttrue@nulltruetrue再去定义对话框的布局,首先来个圆角背景:android:width="0.8dp"android:color=...

weixin_33958871的博客 312

Android 自定义控件 onDraw() onLayout()方法

Android 自定义控件是指开发者根据自己的需求和设计,自己编写控件的外观和行为,以实现更加个性化的界面效果。自定义控件可以是一个简单的按钮,也可以是一个复杂的图表控件,甚至可以是一个完整的应用程序。

YDHIT的博客 1779

Android项目源码界面超级华丽的仿QQ最新版本

这是一个我们比较熟悉的一款应用,高仿专仿最新QQ应用源码,也是一个高仿QQ最新版本的项目,界面超级华丽,使用了大量的自定义控件项目实现了部分功能,例如WIFI-FTP(把手机变成FTP服务端,可以在WEB端管理手机文件) 、字母列表索引、自定义相机等,其余大多是实现了界面,没有功能。项目比...

chijihao1351的博客 306

安卓巴士Android开发神贴整理

10个经典的Android开源应用项目http://www.apkbus.com/android-13519-1-1.html安卓巴士总结了近百个Android优秀开源项目,覆盖Android开发的每个领域http://www.apkbus.com/android-17627-1-1.html一个demo让你掌握Android的各种Service:http://www.apkbus.com/and...

weixin_30409849的博客 67

android自定义控件的创建和使用

一、  重点如何在layout(xml)中使用自定义控件二、  举例1.          功能:实现一个新的浏览器控件,使点击浏览器中任何位置都能打印Log信息2.          步骤:1)         建立projecta)          在eclipse中点击菜单File->New->Project……b)         选择Android Project按Nextc)          填写project的各项内容如下Project name: test_xy // 目录名, 它位于

super005的专栏 2万+

Android自定义控件》TurntableView,抽奖转盘

转载请标明出处:https://blog.csdn.net/m0_38074457/article/details/86433483 ,本文出自【陈少华的博客】 一、效果图 二、实现步骤 三、代码实现 1、attrs.xml中添加自定义控件的属性 &lt;declare-styleable name="TurntableView"&gt; &lt;!--转盘的...

陈少华的博客 2112

android radiogroup里面可以放其他控件吗,Android自定义View组合控件自定义RadioGroup实现的分段选择控件,分段选择...

项目需求,自己实现分段选择控件,写的不足之处,希望体谅......但是我觉得好多项目都有,挺实用的具体实现不好描述,可参考demo,查看源码*效果图topcontrol.gif分析1.简单的组合控件2.用代码绘制StateListDrawable、GradientDrawable、ColorStateList使用1.在项目gradle中添加allprojects {repositories {.....

weixin_34109927的博客 445

如何把Android的一款自定义仪表盘控件整合到你的项目

Android的这款自定义仪表盘控件,我已上传了。 在你的项目里如果需要用到这款自定义的仪表盘控件(Gauge),可参照以下步骤来完成: 1,先添加res类的文件到目标工程的res目录下的对应文件夹下。这主要是Gauge 工程文件里res目录下的drawable、layout、values里的一些文件。具体是那些文件,如下图 2,再在目标工程的src目录下新建一个包,把GaugeVi

毛先森的专栏 3299

用C++ Qt实现安卓电池充电动效 | 打造工业级电量控件

用C++ Qt实现安卓电池充电动效 | 打造工业级电量控件

m0_73443478的博客 1068

android 多图上传插件,Android自定义View实现多图片选择控件

前言相信很多朋友在开发中都会遇到图片上传的情况,尤其是多图上传,最经典的莫过于微信的图片选择了。所有很多情况下会使用到多图选择,所以就有了这篇文章,今天抽点时间写了个控件。•支持自定义选择图片的样式•支持设置图片选择数量•支持图片预览,删除•支持图片拍照先来看看效果实现分析假如不定义控件,我们要实现这样一个功能,无非是写个GridView在item点击的时候去显示图片进行选择,在返回界面的时候进行...

weixin_30420799的博客 712

android 控件宽度自适应_Android自定义控件:自适应大小的文本控件

需求自适应大小的文本:效果图:项目开发中,开发人员根据UI人员提供的一套尺寸,布局了一些带文本的页面,往往会少考虑一些数据极限的问题,造成机型屏幕适配问题。例如:文本(或数值)长度可变,如经验值、金币数量等,如果页面同一高度使用了多个Textview布局摆放,当Textview文本长度增加时,有可能造成重叠现象。例子还有很多,相信很多开发人员也都曾遇到过。今天我们就写一个简单的例子,解决该问题。我...

weixin_39642990的博客 515

android 自定义组合actionbar,Android自定义组合控件

自定义组合控件步奏略繁琐,为了避免再次忘记,记之且共勉这里以我自定义的MyActionBar为例1. 定义组合控件的xml文件例:actionbar.xml2.实现该组合控件的Java代码例:MyActionBar.javapackage cn.edu.wust.hospital.widget;import android.app.Activity;import android.content.C...

weixin_42107561的博客 179

Android自定义控件_动态水波纹效果的进度球

最近有个项目,里面要用到进度球,类似于360的流量球效果,经过一段时间的琢磨,实现了如下效果的自定义控件。 添加依赖 在外层build.gradle中添加如下代码: allprojects { repositories { ... maven { url 'https://jitpack.io' } } } 在项目build.gradle添加依赖: ...

qq_40976230的博客 1707
下一篇: C++ ADO方式连接mysql数据库
lbcab
博客等级 码龄14年 33粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值