Android自定义ViewGroup(一)——带箭头的圆角矩形菜单

这篇博客介绍了如何在Android中自定义一个带箭头的圆角矩形菜单,包括定义attrs.xml以配置属性,自定义ViewGroup类并重写onMeasure(), onLayout(), dispatchDraw()方法,以及在XML和代码中引用和使用自定义组件的详细步骤。文章旨在提供自定义ViewGroup的实践指导。" 135437738,8753399,ParaView 数据选择与过滤指南,"['ParaView', '数据处理', '可视化', '科学计算']
摘要由CSDN通过智能技术生成

今天要做一个带箭头的圆角矩形菜单,大概长下面这个样子:


要求顶上的箭头要对准菜单锚点,菜单项按压反色,菜单背景色和按压色可配置。

最简单的做法就是让UX给个三角形的图片往上一贴,但是转念一想这样是不是太low了点,而且不同分辨率也不太好适配,干脆自定义一个ViewGroup吧!

自定义ViewGroup其实很简单,基本都是按一定的套路来的。

一、定义一个attrs.xml

就是声明一下你的这个自定义View有哪些可配置的属性,将来使用的时候可以自由配置。这里声明了7个属性,分别是:箭头宽度、箭头高度、箭头水平偏移、圆角半径、菜单背景色、阴影色、阴影厚度。

<resources>
    <declare-styleable name="ArrowRectangleView">
        <attr name="arrow_width" format="dimension" />
        <attr name="arrow_height" format="dimension" />
        <attr name="arrow_offset" format="dimension" />
        <attr name="radius" format="dimension" />
        <attr name="background_color" format="color" />
        <attr name="shadow_color" format="color" />
        <attr name="shadow_thickness" format="dimension" />
    </declare-styleable>
</resources>

二、写一个继承ViewGroup的类,在构造函数中初始化这些属性

这里需要用到一个obtainStyledAttributes()方法,获取一个TypedArray对象,然后就可以根据类型获取相应的属性值了。需要注意的是该对象用完以后需要显式调用recycle()方法释放掉。

public class ArrowRectangleView extends ViewGroup {
    ... ...
    public ArrowRectangleView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        TypedArray a = context.getTheme().obtainStyledAttributes(attrs,
                R.styleable.ArrowRectangleView, defStyleAttr, 0);
        for (int i = 0; i < a.getIndexCount(); i++) {
            int attr = a.getIndex(i);
            switch (attr) {
                case R.styleable.ArrowRectangleView_arrow_width:
                    mArrowWidth = a.getDimensionPixelSize(attr, mArrowWidth);
                    break;
                case R.styleable.ArrowRectangleView_arrow_height:
                    mArrowHeight = a.getDimensionPixelSize(attr, mArrowHeight);
                    break;
                case R.styleable.ArrowRectangleView_radius:
                    mRadius = a.getDimensionPixelSize(attr, mRadius);
                    break;
                case R.styleable.ArrowRectangleView_background_co
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值