自定义ViewGroup之Topbar----布局代码的缩减,实现app风格的高度一致

Android view手势拖动和缩放 在实际开发中很多地方都要用自定义的手势缩放和可移动的view,在下在开发不久的时候就遇到啦,当时还不懂手势拖动,经过了各种摸索和查阅终于是自己写出来了,感觉收获颇多,这里我是用的矩阵来对自定义的ImageView进行手势缩放和移动的,感觉matrix真是强大的,稍后我定要详细研究一下Matrix, 之后也会写一片博客大家一起讨论啊,学好数学还真是有用,这里我用的OntouchEvent来做的,下面看 阅读详情


最近写项目,有二三十个布局,都具有相同风格的标题栏,如果每一个界面都反复写一个布局,重复的工作太多,代码重复也多,于是自定义一个ViewGroup作为通用的Topbar,通过设置标签属性达到风格一致,细节不同的效果,大量缩减代码量和布局的复杂度,切能让app风格高度一致;

主要实现功能:

1、可自由设置布局背景、图标

2、自由控制Topbar中button的显示和隐藏

3、可为不同的Button添加点击监听事件

先上效果图:










实现步骤

1、在values文件夹中新建一个attrs.xml ,声明需求属性,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="Topbar">
        <attr name="title" format="string"/>
        <attr name="titleTextSize" format="dimension"/>
        <attr name="titleTextColor" format="color"/>

        <attr name="leftButtonTextColor" format="color"/>
        <attr name="leftButtonBackground" format="reference|color"/>
        <attr name="leftButtonText" format="string"/>

        <attr name="rightButtonTextColor" format="color"/>
        <attr name="rightButtonBackground" format="reference|color"/>
        <attr name="rightButtonText" format="string"/>

    </declare-styleable>
    
</resources>
布局左侧一个Button 中间一个显示标题的TextView 右侧一个Button

2、新建一个类,继承自RelativeLayout,在此类中实现资源属性的获取和赋值,和内部控件的布局,自定义监听接口,实现不同按钮的点击效果,添加方法,实现控件的显示和隐藏,代码如下:

package com.dz.qiangwan.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.dz.qiangwan.qwtest.R;

/**
 * Created by Administrator on 2016/11/9.
 */

public class Topbar extends RelativeLayout {
    private Button leftButton,rightButton;//左侧和右侧按钮
    private TextView titleTextView;   //标题TV

    private int leftTextColor; //左侧按钮的属性
    private String leftText;
    private Drawable leftBackground;

    private int rightTextColor;//右侧按钮的属性
    private String rightText;
    private Drawable rightBackground;

    private String titleText;    //标题相关的属性
    private float titleTextSize;
    private int titleTextColor;

    LayoutParams leftParams,rightParams,titleParams;
    
    private OnTopbarClickListener mTopbarClickListener;
    
    //定义点击Topbar监听接口
    public interface OnTopbarClickListener{
        void onLeftClick();
        void onRightClick();
    }

    public void setOnTopbarClickListener(OnTopbarClickListener onTopbarClickListener){
        this.mTopbarClickListener = onTopbarClickListener;
    }


    public Topbar(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.Topbar);
        //获取左侧button定义的属性
        leftTextColor=typedArray.getColor(R.styleable.Topbar_leftButtonTextColor,0);
        leftText=typedArray.getString(R.styleable.Topbar_leftButtonText);
        leftBackground=typedArray.getDrawable(R.styleable.Topbar_leftButtonBackground);
        //获取右侧button定义的属性
        rightTextColor=typedArray.getColor(R.styleable.Topbar_rightButtonTextColor,0);
        rightText=typedArray.getString(R.styleable.Topbar_rightButtonText);
        rightBackground=typedArray.getDrawable(R.styleable.Topbar_rightButtonBackground);
        //获取标题定义的属性
        titleText=typedArray.getString(R.styleable.Topbar_title);
        titleTextSize = typedArray.getDimension(R.styleable.Topbar_titleTextSize,12);
        titleTextColor = typedArray.getColor(R.styleable.Topbar_titleTextColor,0);

        //释放资源
        typedArray.recycle();
        //为按钮和标题设置属性
        leftButton = new Button(context);
        rightButton = new Button(context);
        titleTextView = new TextView(context);

        leftButton.setText(leftText);
        leftButton.setTextColor(leftTextColor);
        leftButton.setBackground(leftBackground);
        
        rightButton.setText(rightText);
        rightButton.setTextColor(rightTextColor);
        rightButton.setBackground(rightBackground);

        titleTextView.setText(titleText);
        titleTextView.setTextColor(titleTextColor);
        titleTextView.setTextSize(titleTextSize);
        titleTextView.setGravity(Gravity.CENTER);

        this.setBackgroundColor(getResources().getColor(R.color.colorTheme));

        //将控件以对应的参数添加到RelativeLayout中
        leftParams = new LayoutParams(65,65);
        leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT,TRUE);
        leftParams.addRule(RelativeLayout.CENTER_VERTICAL);
        addView(leftButton,leftParams);

        rightParams = new LayoutParams(65,65);
        rightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        rightParams.addRule(RelativeLayout.CENTER_VERTICAL);
        addView(rightButton,rightParams);

        titleParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
        titleParams.addRule(RelativeLayout.CENTER_IN_PARENT);
        addView(titleTextView,titleParams);

        leftButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                if(mTopbarClickListener!=null){
                    mTopbarClickListener.onLeftClick();
                }
            }
        });

        rightButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                if(mTopbarClickListener!=null){
                    mTopbarClickListener.onRightClick();
                }
            }
        });
    }

    public void setLeftButtonInvisible(){
            leftButton.setVisibility(View.INVISIBLE);
    }

    public void setRightButtonInVisible(){
            rightButton.setVisibility(View.INVISIBLE);
    }


}

3、自定义布局的使用:

    <com.dz.qiangwan.view.Topbar
        android:paddingLeft="5dp"
        android:layout_width="match_parent"
        android:layout_height="45dp"
        custom:rightButtonBackground="@mipmap/setting"
        custom:title="个人中心"
        custom:titleTextSize="6dp"
        custom:titleTextColor="#ffffff"
        android:paddingRight="5dp"
        />
注意根布局中要声明此行代码:
xmlns:custom="http://schemas.android.com/apk/res-auto"

4、控件在代码中的使用

    private void initView() {
        topbar = (Topbar) findViewById(R.id.topbar);
    }

    private void setListener(){
        topbar.setOnTopbarClickListener(new Topbar.OnTopbarClickListener() {
            @Override
            public void onLeftClick() {
                Toast.makeText(MainActivity.this, "左侧按钮被点击了", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onRightClick() {
                Toast.makeText(MainActivity.this, "右侧按钮被点击了", Toast.LENGTH_SHORT).show();
            }
        });
    }


使用起来简单方便,最重要的是复用度高,大大减少布局代码和布局复杂度,使app风格完全统一。以上供各位参考指教。











图片手势滑动,多点触摸放大缩小 程序源码 android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果(仿腾讯,新浪),这里面实现多少会有不足之处,大家在运用的时候根据需求自行调整,大多都是多数图片左右切换实现,这个大家可以自定义ViewGroup或者重写控件实现. 立即下载

相关推荐

AndroidZoomableViewGroup:带有边界的Android可缩放视图组

AndroidZoomableViewGroup 我花了一天时间寻找Zoomable ListView,每个答案都以某种方式被破坏了。 最终,我找到了一个不错的模板,并进行了一些更改以处理滚动边界。 多亏了ricky on stackoverflow。 我使用了他的ZoomableListView并进行了一些更改。 您可以扩展任何视图,这将很好地工作。 此版本进行了一些更改,以防止用户滚动到屏幕之外。 随时尝试。 这真的很容易实现。

Jetpack Compose 顶部栏(TopAppBar / CenterAlignedTopAppBar / LargeTopAppBar)

Top App Bar 是 Android 应用顶部导航组件,Material3 提供三种主要实现:基础型(TopAppBar)、居中标题型(CenterAlignedTopAppBar)和可折叠大型(LargeTopAppBar)。它们共享核心参数如标题、导航图标、动作按钮等,并通过 scrollBehavior 实现与内容的滚动联动。使用时需注意颜色主题适配、标题文本对齐优化(避免基线偏移)、图标点击热区规范(48.dp)等细节。特别在沉浸式布局中,需正确处理系统栏内边距。示例代码展示了基础使用、自定义

giaoly的博客 1971

android 继承viewgroup, 自定义布局,拖动效果,增删效果

继承viewgroup, 编写自定义坐标布局,添加增删时动画操作, 拖动移除效果

Android UI 模板设计——Topbar

新建一个java类,名为Topbar,让它继承RelativeLayout。如果是使用一般的置顶控件,不需要自定义属性的话,那么选择第一个方法即可,因为这里我们要自定义属性,所以选择第二个方法。首先我们需要定义三个控件。然后再声明我们之前自定义的那些属性。然后要对这些属性进行赋值,使控件和属性进行关联。

JluTiger316的博客 962

PX4算法解析:L1制导律

一、前沿 从今天开始,会陆续为大家解读开源飞控软件px4中使用到的各种算法,今天要讲述的是L1制导律,这是固定翼飞机进行路径跟踪的重要算法之一。这个算法是由MIT的研究人员提出,因为具有比较好的路径跟踪效果而得到广泛应用。在这之前,无人机在进行路径跟踪时一般采用基于侧偏距的PD控制器方法,至于为什么使用PD而不使用PID算法,那是因为位置环响应较慢,所以一般在外环采用PD算法,而在内环采用PID算...

weixin_44616080的博客 8258

支付宝支付(三):周期扣款实现注意细节

一、周期扣款实现说明 1、官方文档入口:https://opendocs.alipay.com/open/20190319114403226822/intro 2、根据官方文档说明,周期扣款有两种方式:先签约后代扣场景和支付后签约场景 3、周期扣款接入问题文档: a>https://opendocs.alipay.com/support/01rg24 b>https://opensupport.alipay.com/support/knowledge/50249/20160248753

新鲜雾霾的博客 5707

viewgroup使子类缩放 双指缩放

因为特殊需求,需要让webview控件缩放,但是禁止webview自带的缩放功能,所以在网上找了很多demo,找了很多天才找到的,防止遗失,也方便大家寻找到适合的代码,所以我就发布到这里来了。注:此类是继承FrameLayout的实现类,在写ViewGroup的时候,只需要将需要缩放的控件包裹起来就可以了。欢迎互相帮助 Y(^o^)Yimport android.content.Context; ...

buyaoshitududongwo的博客 1835

2025海外代理IP深度横评:Bright Data、IPFoxy、SmartProxy等六大服务商实战对比

本文深度横评2025年六大海外代理IP服务商(Bright Data、IPFoxy、SmartProxy、IPIPGO、Kookeey及青果网络),基于实战测试数据,从IP池质量、速度稳定性、性价比等维度进行对比。针对跨境电商、数据爬虫、社交媒体管理等不同业务场景,提供精准的选购指南与避坑建议,帮助企业用户根据自身需求选择最合适的代理IP解决方案。

weixin_29196891的博客 436

Android开发之View双指缩放ViewGroup双指缩放视频双指缩放图片双指缩放

老套路先上图 核心代码使用view的缩放API即可 setScaleX(scale); setScaleY(scale); 在看下自定义可缩放的view package cn.xiayiye5.xiayiye5library.view; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; impo

xiayiye5的博客 2833

MACS2软件进行Peak calling

MACS2可以检出ChIP-Seq,ATAC-seq 以及 MeRIP-seq (RNA甲基化测序) 等富集的序列。peaks calling 有不同的方法,MACS2是最常用的call peaks工具。 MACS全称Model-based Analysis of ChIP-Seq,最初的设计是用来鉴定转录因子的结合位点,但是它也可以用于其他类型的富集方式测序。usage: macs2 [-h] [--version] {callpeak,bdgpeakcall,bdgbroadca

qq_27390023的博客 3791

半导体设备上位机开发:我的经验与新人指导

半导体设备上位机开发是一项复杂而富有挑战性的工作,需要扎实的技术基础和丰富的经验。如果你对半导体设备上位机开发感兴趣,欢迎随时与我交流,我会尽力帮助你!

qq_43518667的博客 2735

获取topbar的高度

public static int getStatusBarHeight(Activity activity) { Class<?> c = null; Object obj = null; Field field = null; int x = 0, sbar = 38; try { c = ...

weixin_30856725的博客 208

Wireshark教程:解密HTTPS流量

Wireshark教程:如何解密HTTPS流量

nuan444979的博客 1万+

比例缩放viewgroup

可以指定宽高比例的viewgroup,高度由宽度决定。包裹内容时宽度由子view宽度决定,matchparent时宽度由父view宽度决定 效果图 使用方式 &lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/androi...

weixin_33896726的博客 254

HarmonyOS 鸿蒙开发DevEco Studio OpenHarmony:安全测试

通过对HarmonyOS应用生命周期建模和应用攻击面建模,采用静态数据流分析技术,提高漏洞发现的准确率,同时覆盖20余种攻击面,65+漏洞测试项,帮助开发者提前发现和识别漏洞隐患。在检测报告中,会针对每一项漏洞风险项给出明确的修复建议,可以帮助开发者快速修复漏洞。

斌擎科技 1183

因素空间与可拓学的互补性分析及问题处理融合模型

随着知识与信息数量的快速增长以及信息获取便利性的增加,企事业组织所面临的内外部环境更加复杂,业务问题呈现非线性、不确定性、多维化和实时交互性等特点。业务环境的高度不确定性和面临问题的开放性,人工智能与问题处理的深入研究迫切需要有一种自觉地为信息科学与智能科学服务的定性定量相结合的智能数学模型。经典数学适于描述物质世界的数量与空间关系,智能数学必须能描述信息拓展与智能机理。

weixin_70923796的博客 261

android自定义控件之TopBar

步骤:1.res-&gt;values目录下新建attrs.xml文件。             2.新建一个类继承自ViewGroup &lt;resources&gt; &lt;declare-styleable name="TopBar"&gt; &lt;attr name="title" format="string"/&gt; &

qq_27773675的博客 626

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

js缩减代码

1.获取url参数 let q={}; location.search.replace(/([?&=]+)=([&]+)/g,(_,k,v)=>q[k]=v); console.log(q) 2.随机生成十六进制颜色 console.log(’#’ + Math.floor(Math.random() * 0xffffff).toString(16).padEnd(6, ‘0’)) 3.数组去重 let arr = [1,2,3,1,2,3,4,] console.log([…new

weixin_44897694的博客 260

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Android自定义ViewGroup View的大小和坐标控制

[java] view plaincopy 除非你总是需要一个100×100像素的控件,否则,你必须要重写onMeasure。      onMeasure方法在控件的父元素正要放置它的子控件时调用。它会问一个问题,“你想要用多大地方啊?”,然后传入两个参数——widthMeasureSpec和heightMeasureSpec。   它们指明控件可获得的空间以

专注Android开发 2394

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

AndroidWiki - ViewGroup等比例缩放子view

大小屏监听,及等比例缩放子view private void getScreenSize() { int[] screenSize = Tools.getScreenSize(mContext); if (screenSize.length &gt;= 2) { SCREEN_WIDTH = screenSize[0]; ...

BlueYangDroid的专栏 3191

自定义一个TopBar(完整流程)

自定义一个Toolbar基本步骤 自定义属性 自定义view 使用view 自定义属性 在values目录下新建atts.xml 文件 atts.xml 内容如下:其中topbar分三部分:title left right 实现这三部分的自定义 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name

Hongv的博客 1682

可以拖拽的ViewGroup,仿微信拖拽缩放关闭

此处利用了ViewDragHelper类 内部设置了一个监听,松手进行关闭即可 import android.content.Context; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.view.ViewCo...

buyaoshitududongwo的博客 759

Android View系统分析之二View与ViewGroup

在Android View系统分析之从setContentView说开来(一)一文中,我们从setContentView开始阐述了Android中的视图层次,从设置内容布局到整个视图层次的建立的过程。并且对View和ViewGroup的关系进行了简单的介绍,今天我们继续来深入的了解Android中的View和ViewGroup。

Mr.Simple的专栏 6446
上一篇: 超级简单的ButterKnife使用技巧
下一篇: Android自定义iOS风格Dialog
coder_e
博客等级 码龄10年 6粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值