自定义组件之卫星Button(一)

  方案来自慕课网,因水平和记忆力有限,将方案记录于此。

  移动开发一个好的应用离不开漂亮的UI,漂亮的UI离不开充满想象力的UI组件。在此记录一个自定义UI组件的案例,也是学习自定义UI的开始。本例是satellite-menu的一种实现。satellite-menu效果如下图:

  

  我们需要认识这个组件。这个组件相较于其他组件有两个特别的属性。一个是组件的位置,另一个是组件Item与Button的距离。这两个属性,我们希望开发者能自定。

  第一步,我们在value文件夹下,建立一个xml文件attr.xml,将这两个属性,和这个自定义组件的命名放进去:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="position">
        <enum name="left_top" value="0"/>
        <enum name="left_bottom" value="1"/>
        <enum name="right_top" value="2"/>
        <enum name="right_bottom" value="3"/>
    </attr>
    <attr name="radius" format="dimension"/>

    <declare-styleable name="CustomButton">
        <attr name="position"/>
        <attr name="radius"/>
    </declare-styleable>
</resources>

  其中,position是Button的位置,这是个枚举型的属性,Button只能存在于屏幕的四角。radius是一个尺寸型的属性,它表示了组件Item与Button的距离。declare-styleable用于给自定义组件添加自定义属性。上面一段就是给declare-styleable添加了两个自定义属性。

  第二步,建立新的CustomButton类,并完成初始化。

  

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import com.memeda.lsy.mycustombutton.R;

/**
 * Created by Administrator on 2015/4/15.
 */
public class CustomButton extends ViewGroup {
    private static final int POS_LEFT_TOP = 0;
    private static final int POS_LEFT_BOTTOM = 1;
    private static final int POS_RIGHT_TOP = 2;
    private static final int POS_RIGHT_BOTTOM = 3;

    private Position mPosition=Position.RIGHT_BOTTOM;
    private int mRadius = 100;
    private Status mStatus = Status.CLOSE;
    private OnItemClickListener mOnItemClickListener;

    /**
     * 菜单的主按钮
     */
    private View mCButton;

    public void setmOnItemClickListener(OnItemClickListener mOnItemClickListener) {
        this.mOnItemClickListener = mOnItemClickListener;
    }

    public void setmPosition(Position mPosition) {
        this.mPosition = mPosition;
    }

    public void setmRadius(int mRadius) {
        this.mRadius = mRadius;
    }

    /**
     * 菜单位置枚举类
     */
    public enum Position{
        LEFT_TOP
        ,LEFT_BOTTOM
        ,RIGHT_TOP
        ,RIGHT_BOTTOM
    }
    /**
     * 菜单开关枚举类
     */
    public enum Status{
        OPEN,CLOSE
    }
    /**
     * 点击子菜单的回调接口
     */
    public interface OnItemClickListener{
        void onClick(View view , int position);
    }

    public CustomButton(Context context) {
        this(context , null);
    }
    public CustomButton(Context context, AttributeSet attrs) {
        this(context,attrs,0);
    }
    public CustomButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //获取mRadius的初始值100dp
        mRadius = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,100,getResources().getDisplayMetrics());
        //获取组件参数数组
        TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomButton,defStyleAttr,0);
        //获取Button位置
        int pos = a.getInt(R.styleable.CustomButton_position,POS_RIGHT_BOTTOM);
        switch (pos){
            case POS_LEFT_TOP:
                mPosition = Position.LEFT_TOP;
                break;
            case POS_LEFT_BOTTOM:
                mPosition = Position.LEFT_BOTTOM;
                break;
            case POS_RIGHT_TOP:
                mPosition = Position.RIGHT_TOP;
                break;
            case POS_RIGHT_BOTTOM:
                mPosition = Position.RIGHT_BOTTOM;
                break;
        }
        //获取Item与Button的距离
        mRadius = (int) a.getDimension(R.styleable.CustomButton_radius
                ,mRadius);

        a.recycle();
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {

    }
}

  至此,自定义组件的属性和读出属性的方法已经实现,我们可以在布局文件中使用它。

  

xmlns:custombutton = "http://schemas.android.com/apk/res-auto"    <com.memeda.lsy.mycustombutton.view.CustomButton
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        custombutton:position="right_bottom"
        custombutton:radius="120dp">
        </com.memeda.lsy.mycustombutton.view.CustomButton>

  以上,下一节,将开始绘制自定义组件的外观。

  

时间: 2024-11-06 16:23:53

自定义组件之卫星Button(一)的相关文章

Unity3D 在自定义脚本中实现Button组件上的OnClick面板

Unity3D 在自定义脚本中实现Button组件上的OnClick面板UnityEvent脚本代码事件传参多参数传入下述内容不对c#语法做过多讲解,仅对已入门并有兴趣的同学做为学习和拓展的资料 大家在Unity制作的过程中一定都使用过UI功能,那么很多人也一定见过这个面板: 那么我们如何能在自己的脚本中添加上像OnClick这样的面板呢. UnityEventUnity中内置了一个UnityEvent类作为事件处理的类,我们只要在脚本中声明出来,Unity便会自动添加到脚本面板上,这样便可以在

Vue1.0学习总结(4)———Vue1.0自定义组件、Vue1.0组件之间的通信

Vue自定义组件: 组件:就是一个大的对象:new Vue({})就是一个组件定义一个组件:1.全局组件: <div id="box"> <aaa></aaa> </div> var Aaa=Vue.extend({ template:'<h3>我是一个标题</h3>' }); Vue.component('aaa',Aaa); a)给自定义的组件添加数据: data必须是函数的形式,函数必须返回一个对象(json

【ExtJS】自定义组件datetimefield(一)

目的: ExtJS中提供了下拉日期选择控件Ext.form.field.Date与下拉时间选择控件Ext.form.field.Time.不过没有一个在选择日期时选择时间的控件datetimefield.目的就是运用自定义组件的方法,来扩展下拉日期选择控件Ext.form.field.Date,在下拉框中添加时间选择的组件.目标效果: 第一步:继承Ext.picker.Date,创建My.picker.DateTime类 1 Ext.define('My.picker.DateTime', {

Vue结合原生js实现自定义组件自动生成

就目前三大前端主流数据驱动框架(vue,ng,react)而言,均具有创建自定义组件的api,但都是必须先做到事先写好挂载点,这个挂载点可以是原有静态元素标签也可以是自定义模板:对于多种组件通过同一数据流生成的,如果事先在页面上写好挂载点(mounted),然后通过dom操作去动态添加,会遇到类似这样一条错误提示信息:Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.(…).这又是为何呢,下一

【REACT NATIVE 系列教程之二】创建自定义组件&&导入与使用示例

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2219.html 在上一篇  [REACT NATIVE 系列教程之一]触摸事件的两种形式与四种TOUCHABLE组件详解 中的最后介绍了如何使用Touchable的四种组件进行监听触摸事件.  那么紧接着我们利用Touchable来包装一个带图片的Button组件,且设计成可接受很多自定义参数. 一:创建我们自定义

自定义组件------带删除功能的EditText

以前在为EditText添加左侧图标,以及右侧一个删除按钮时,经常是使用FrameLayout,当这样代码复用差,维护也麻烦.最好的方法是重写EditText实现该功能.现在看看效果图,后面再讲解实现方式. 重写之后的组件有如下功能,只有当EditText内容不为空,而且获得焦点,才会出现删除按钮,点击删除按钮则清空内容.代码如下: public class CleanableEditText extends EditText { //回调函数 private TextWatcherCallBa

Android自定义组件系列【6】——进阶实践(3)

上一篇<Android自定义组件系列[5]--进阶实践(2)>继续对任老师的<可下拉的PinnedHeaderExpandableListView的实现>进行了分析,这一篇计划中间插一段"知识点",对Android中的事件分发机制进行解析.细心的朋友可能会发现,打开大牛写的Android项目,里面很多组件都是自定义的(这就是为什么界面和体验这么吸引你的原因),但是要灵活的去自定义组件就必须对手势(也就是各种监听)必须熟悉,能处理好事件之间的关系. 先看一段代码:

android自定义组件

官方文档 /Myselfcomponent/res/values/attrs.xml <?xml version="1.0" encoding="utf-8"?> <resources>     <declare-styleable name="MyView"         >         <attr name="textColor" format="color&quo

Android开发——构建自定义组件

Android中,你的应用程序程序与View类组件有着一种固定的联系,例如按钮(Button). 文本框(TextView), 可编辑文本框(EditText), 列表框(ListView), 复选框(CheckBox), 单选框(RadioButton), 滚动条(Gallery), 微调器(Spinner), 等等,还有一些比较先进的有着特殊用途的View组件,例如 AutoCompleteTextView, ImageSwitcher和 TextSwitcher.除此之外,种类繁多的像 线