Android 适配(百分比布局 GridView+ListView 项布局适配)

安卓布局本质:ViewGroup约束系统与页面生命周期耦合 安卓布局不是静态UI描述,而是由ViewGroup驱动的动态约束系统,其核心在于measure-layout-draw三阶段与Activity/Fragment生命周期深度耦合。理解ConstraintLayout的约束求解原理、LinearLayout的weight分配机制及RelativeLayout的依赖图局限,是应对设备碎片化、折叠屏适配、TV焦点导航等工程挑战的基础。布局性能瓶颈(如嵌套过深、onMeasure耗时超标)往往源于对ViewGroup测量逻辑和MeasureSpec传递规则的误读。掌 阅读详情

百分比布局

参考鸿洋大神的百分比布局扩展,详细请看这里

优快云:https://blog.youkuaiyun.com/lmj623565791/article/details/46767825

github:https://github.com/hongyangAndroid/android-percent-support-extend

支持的布局

com.zhy.android.percent.support.PercentLinearLayout

com.zhy.android.percent.support.PercentRelativeLayout

com.zhy.android.percent.support.PercentFrameLayout

支持的属性 

  • layout_heightPercent
  • layout_widthPercent
  • layout_marginBottomPercent
  • layout_marginEndPercent
  • layout_marginLeftPercent
  • layout_marginPercent
  • layout_marginRightPercent
  • layout_marginStartPercent
  • layout_marginTopPercent
  • layout_textSizePercent
  • layout_maxWidthPercent
  • layout_maxHeightPercent
  • layout_minWidthPercent
  • layout_minHeightPercent
  • layout_paddingPercent
  • layout_paddingTopPercent
  • layout_paddingBottomPercent
  • layout_paddingLeftPercent
  • layout_paddingRightPercent

使用下来发现,基本能满足手机适配,但当屏幕宽高比例差距太大时,会有一定的拉伸,具体看自己项目实际运行环境

GridView / ListView 的适配

还有一个问题是对 GridView 跟 ListView 的项布局支持不太好,下面记录下如何适配项布局,到达百分比适配的效果

首先GridView和ListView的父类都是 AbsListView,可以在其中找到一个方法 LayoutParams()

        public LayoutParams(int w, int h) {
            super(w, h);
        }

 对布局大小的设置,在代码中设置 宽高占比

在适配器中,通过代码去设置 百分比宽高

public class SearchGirdViewAdapter extends BaseAdapter {

    private Context context;
    private List<String> list;
    private GridView gridView;

    public SearchGirdViewAdapter(Context context, List<String> departments, GridView gridView) {
        this.gridView = gridView;
        this.context = context;
        list = new ArrayList<>();
        list.addAll(departments);
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View v, ViewGroup parent) {

        //获取 gridView 的宽高
        int width = gridView.getWidth();
        int heigth = gridView.getHeight();

        //设置 宽高比例
        AbsListView.LayoutParams param = new AbsListView.LayoutParams((int) (width * 0.23), (int) (heigth * 0.3));

        SearchGirdViewAdapter.ViewHolder viewHolder;
        if (null == v) {
            viewHolder = new SearchGirdViewAdapter.ViewHolder();
            v = LayoutInflater.from(context).inflate(R.layout.item_fragment_search, parent, false);
            v.setLayoutParams(param);
            viewHolder.title = v.findViewById(R.id.search_item_title);
            v.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) v.getTag();
            v.setLayoutParams(param);
        }
        viewHolder.title.setText(list.get(position));
        return v;
    }

    class ViewHolder {
        TextView title;
    }


}

主要看 getView()方法中, 通过代码设置 LayoutParams, 这里我测试代码,直接设置 宽*0.23 高*0.3(此处获取的GridView宽高大小,是在布局文件中占的大小,不是整个屏幕的大小)

项布局文件如下

<?xml version="1.0" encoding="utf-8"?>
<com.zhy.android.percent.support.PercentRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:background="@drawable/category_genre_item_bg">

    <TextView
        android:id="@+id/search_item_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:ellipsize="end"
        android:gravity="center"
        android:maxLines="1"
        android:text="电台测试"
        android:textColor="#fff"
        app:layout_textSizePercent="12%w" />

</com.zhy.android.percent.support.PercentRelativeLayout>

可以看到,使用的是PercentRelativelayout,中间就简单放了一个TextView

运行效果如下

红色部分,GridView显示情况,ListView情况类似。具体实现可以在适配器中增加两个宽高百分比属性,外部通过代码设置值,做到灵活应用。

 

 

Android下拉刷新控件SwipeRefreshLayout实战指南 下拉刷新是移动应用中最基础的用户交互模式之一,其本质是将用户滑动意图转化为数据加载行为并提供符合Material Design规范的视觉反馈。SwipeRefreshLayout作为Android官方提供的轻量级嵌套滚动刷新组件,基于NestedScrollingParent/Child协议实现,无需侵入业务逻辑即可完成触发检测、状态管理与动画渲染。相比早期PullToRefresh等第三方库,它原生兼容RecyclerView、WebView等现代滚动容器,具备低耦合、高稳定性与强可定制性等工程优势。本文 阅读详情

相关推荐

Unity UI性能优化实战:从UGUI迁移到UI Toolkit的性能提升与架构解析

在游戏开发中,UI系统的性能直接影响用户体验,尤其是在移动端和复杂界面场景下。传统的即时模式UI架构,如Unity的UGUI,每帧都需要重建UI元素,导致CPU开销随界面复杂度线性增长,成为性能瓶颈。而保留模式UI架构通过分离UI状态与渲染,仅在状态变化时更新,大幅降低了静态和低频更新界面的CPU占用。这种架构革新为复杂、数据驱动的游戏界面带来了显著的性能提升和更优的内存管理。UI Toolkit作为Unity新一代的UI系统,正是基于保留模式构建,并引入了视觉树、样式表等现代前端开发理念,支持类似CSS的

weixin_34054931的博客 356

Android XML布局开发指南:从基础到性能优化

XML布局是Android UI开发的核心技术,通过声明式语法实现界面与逻辑的分离。其工作原理是将视图层级结构转化为View对象树,具有可视化编辑、多设备适配和维护便捷等技术优势。在工程实践中,LinearLayout、RelativeLayout和ConstraintLayout是最常用的三种布局方式,其中ConstraintLayout凭借其扁平化结构和约束关系,能有效解决嵌套层级过深导致的性能问题。热门的布局复用技术如include标签和ViewStub,配合尺寸限定符等适配方案,能够显著提升开发效率

weixin_30437847的博客 465

Android 百分比布局

百分比布局

安卓开发笔记———布局方式之百分比布局

【代码】安卓开发笔记———布局方式之百分比布局。

m0_55584761的博客 3112

E-SMILES:化学信息学中的分子表示革命与应用

分子表示是化学信息学和计算化学的基础技术,其核心是将复杂的分子结构转化为计算机可处理的数字化形式。传统SMILES格式虽然广泛应用,但在处理复杂化学体系时存在局限性。Extended SMILES(E-SMILES)通过扩展语法规则,支持立体化学、配位键等特殊结构的精确描述,显著提升了分子表示的准确性和适用范围。在药物研发中,E-SMILES能准确描述蛋白质-配体相互作用和共价抑制剂;在材料科学领域,它支持纳米材料和超分子体系的多尺度建模。结合机器学习等前沿技术,E-SMILES正在推动化学信息处理效率的革

weixin_28683165的博客 279

深入解析ADC采样电容:从充电误差到LSB精度的关键设计

本文深入解析了ADC采样电容在模数转换中的核心作用,重点探讨了充电时间常数与采样误差的博弈关系。通过推导最小采样时间公式,揭示了精度、速度、源阻抗与内部电容之间的制约关系,并提供了从理论计算到外部驱动电路设计的实战指南,是确保ADC达到LSB精度的关键。

android的专栏 1103

【Android入门到项目实战--3.2】—— 详解4种基本布局(线性布局、相对布局、帧布局、百分比布局)

LinearLayout又称线性布局,是非常常用的布局,此布局将它所包含的控件在线性方向上依次排列,其下面尝试演示。改变orientation属性为horizontal后效果如下:1、下面加入新属性尝试一下。,而android:gravity指定文字在控件中的对齐方式。2、android:layout_weight属性这个属性允许我们使用比例的方式来指定控件大小,在手机屏幕的适配性方面起到重要作用。下面尝试实现:编写一个消息发送界面。

个人博客 2337

用Scratch实现凯撒密码:图形化编程与古典密码学的趣味结合

字符编码与移位运算是计算机处理文本数据的基础原理之一,它通过将字母映射为数字实现信息转换。在密码学领域,凯撒密码作为最经典的替换密码,直观地展示了基于规则字符替换的加密思想,其核心价值在于通过简单算法揭示加密解密的基本框架。这种原理在编程教育中尤为重要,能够帮助初学者理解循环、变量和字符串处理等核心概念。结合Scratch图形化编程环境,学习者可以通过拖拽积木可视化构建加密算法,将抽象的移位操作转化为交互式游戏。本项目以凯撒密码为例,通过实时密钥调整和动态字母表映射,生动演示加密过程,并自然融入暴力破解和密

weixin_32428571的博客 310

Android百分比布局

android有个百分比布局,于是研究了下。 用途 官方针对屏幕适配的问题提出的一种优化手段,主要用来解决屏幕适配。屏幕适配主要以屏幕宽度为依据。 使用 1.添加依赖 在Module级别的build.gradle中加入如下代码: compile 'com.android.support:percent:26.+' 2.关联命名空间 在需要使用百分比布局的布局文件...

桑心剑 2393

EtherCAT用TwinCAT 3跑DC报0x2C或者0x1A错误码

EtherCAT用TwinCAT 3跑DC报0x2C或者0x1A DC报错 ///////////////////////////////////////////////////////////////////////////////////////// /** \brief Checks communication and synchronisation variables and update AL status / AL status code if an error has occurr

PI_sunyang的博客 5307

知识图谱-构建:知识图谱构建流程【本体构建、知识抽取(实体抽取、 关系抽取、属性抽取)、知识表示、知识融合、知识存储】

旅游领域的类是用来描述旅游的抽象化概念术语,是对众多旅游个体共性的概念化描述。术语是划分类的基础,根据构建领域本体的目标和具体需要,可以确定哪些术语能作为领域本体的类。在以上抽取的众多旅游领域术语中,有些是能直接作为类的,如旅游、人物、交通方式、景区等等,而有些则不能作为类,如票价、景区门票、联系方式等等,它们只是属性。“旅游”很明显是最顶层的类,是父类。然后,要确定旅游的子类,根据大众标签里体现的共性和《中国分类主题词表》确定了旅游领域的11个核心概念,即本体层次结构图数据属性(固有属性)...

u013250861的博客 4万+

Android 常用布局

android view常用布局

look85的专栏 632

40、5G NR射频要求解析

本文详细解析了5G NR射频相关要求,包括参考灵敏度与动态范围的定义、接收机对干扰信号的抗扰性要求(如阻塞、邻道选择性等)、辐射射频要求在FR1和FR2频段的差异,以及多标准无线电基站(MSR)的发展及其对射频要求的影响。内容涵盖测试模型、干扰场景、具体指标和实现挑战,为理解和应用5G NR射频规范提供了全面指导。

qsc901234的博客 245

Android之ListView,AsyncTask,GridView,CardView,本地数据存储,SQLite数据库

版权声明:未经博主允许不得转载 补充 补充上一节,使用ListView是用来显示列表项的,使用ListView需要两个xml文件,一个是列表布局,一个是单个列表项的布局。如我们要在要显示系统所有app列表项时,需要左边appimage视图和右边文本视图。 一个是列表布局 all_app_list.xml &lt;ListView android:id="@andro...

程序员哆啦A梦,蓝胖子 660

SpringCloud Alibaba - Seata 实现高可用和异地容灾

这里不仅仅要实现高可用,还需要实现异地容灾. 异地容灾就是说,如果你整了好几个节点部署起来,全部放到一个机房里面,那么如果这个机房出了故障,就意味着整个集群就完了,所以对于一个大型的集群来讲,都会把这些服务异地部署.问题2:如果我们要实现异地容灾,也就说某一个机房挂了,需要快速的切换到另一个可用的机房,但是这个配置在配置文件中写死了,如果要改配置文件,还需要重启服务器,这是我们不希望看到的,怎么办?进入 seata/bin 目录,运行 seata-server.bat 文件,默认端口为 8091。

CYK_byte的博客 975

YOLOv8改进,YOLOv8主干网络替换为FasterNet(全网独发手把手教学,助力涨点)

FasterNet的整体架构由四个分层阶段组成,每个阶段包含一组FasterNet模块,并在前面加一个嵌入或合并层。最后三层用于特征分类。每个FasterNet模块内部,一个PConv层后跟两个PWConv层,为了保持特征多样性并降低延迟,归一化和激活层仅在中间层之后进行,其中,PConv 是一种快速高效的卷积操作,通过仅对部分输入通道应用卷积滤波器,而保持其余通道不变,从而减少了计算量和内存访问。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2016

9.RecyclerView(ListView的进阶版)

由于我ListView中的尝试就没按照《第一行代码》中的样例来,所以以下内容我都是找的几篇博客看的 与百分比布局类似,都要先添加依赖库 implementation 'com.android.support:recyclerview-v7:28.0.0' RecyclerView的四大组成: 名 用途 Layout Manager Item的布局管理器 Adapt...

George_UP的博客 322

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Android——UI开发的点点滴滴2

1.2详解四种布局 1.2.1线性布局LinearLayout LinearLayout又称线性布局,这个布局会将它所包含的控件在线性方向上依次排列。android:orientation 属性指定排列方向,vertical是垂直方向,horizontal是水平方向。 注意:如果LinearLayout的排列方向是horizontal。内部控件就绝对不能将宽度指定为math_parent,这样的话单独一个控件就会将水平方向占满,同样,若是vertical,就不能将高度指定为math_parent. 补充:

xuan的博客 282

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android andbase,AndBase: 改写后的andbase框架,增加了许多自定义控件,一些通用功能...

就是在这个AbPullToRefreshView包一个ListView或者GridView,这样就可以用BaseActivity来做分页加载了。用法是在Activity里使用initRefreshView方法,需要一些参数requestCode,这个参数是网络请求时标识是哪个请求的,可以参考一下csdn里的HttpUtil[输入链接说明](http://blog.youkuaiyun.com/tianyale...

weixin_42363662的博客 207

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android学习笔记

  1.反编译工具:     1.1: apktool:获取资源文件,图片资源,布局文件和XML文件。     1.2: dex2jar: 将dex代码反编译成java代码。     1.3: jd-g ui: 查看反编译后的Java源码。   2.LinearLayout's Weight: 使用martch_parent:     2.1: 只有一个屏幕,那么看需要分成几份,1...

湫兮若风的博客 900

推荐项目:SwipeMenu - 打造流畅滑动菜单的神器

在追求用户体验至上的移动应用开发领域,如何实现优雅且交互友好的侧滑或上下滑动菜单成为了一个重要课题。今天,我们要向大家隆重推荐一款开源项目——**SwipeMenu**。这款轻量级、高度灵活的库专为Android平台设计,旨在帮助开发者轻松集成横竖方向的滑动菜单功能,极大丰富应用的交互体验。 ## 项目介绍 SwipeMenu是一个强大而全面的解决方案,支持水平和垂直方向的滑动操作,无论是从左...

gitblog_00239的博客 1029

系统Widget相关

组件-控件 一.组件属性 1.android:layout_weight 表示该组件在layout中所占的比重即占布局(layout)的百分比,其值越大,比重越小 注意:{必须将控件的layout_width = “fill_parent”|”match_parent”,否则weight属性将不起作用。} 注:如果设为“fill_parent”则weight属性将是你的控件尽可能的大,最

ccp1994的专栏 1353

flutter学习笔记

1.跨平台移动UI框架2.与现有的代码一起工作(可以直接嵌入到原生代码中或直接把原生代码嵌入到自己的代码中运行)3. 完全免费、开源。

haoxuhong的博客 8246

基于HarmonyOS API 24实战解析宠物健康监测应用:“事件 → 方法 → 状态变更 → 自动渲染“的闭环,是声明式 UI 范式的核心

在移动互联网与智能穿戴设备高度普及的今天,"习惯养成"已经从一个模糊的自我管理理念,演变为一个可量化、可追踪、可视化的数字化产品赛道。越来越多的人希望借助手中的智能终端,把"早起、冥想、阅读、运动"这些抽象的自律行为,转化为一条条清晰的数据曲线和一张张可触摸的打卡卡片。而鸿蒙生态(HarmonyOS)凭借其跨设备协同、分布式软总线以及声明式 UI 开发框架 ArkUI,为这类注重"轻量化交互 + 即时反馈"的生活方式类应用提供了极为理想的生长土壤。本应用正是一款面向"晨间场景"深度打磨的习惯追踪工具。它聚焦

2301_79516720的博客 39

基于HarmonyOS API 24实战解析电影收藏管理@ObjectLink 则用于子组件中接收一个 @Observed 对象的引用,使得子组件能够对该对象的属性变化做出响应式更新

在移动互联网与智能穿戴设备高度普及的今天,"习惯养成"已经从一个模糊的自我管理理念,演变为一个可量化、可追踪、可视化的数字化产品赛道。越来越多的人希望借助手中的智能终端,把"早起、冥想、阅读、运动"这些抽象的自律行为,转化为一条条清晰的数据曲线和一张张可触摸的打卡卡片。而鸿蒙生态(HarmonyOS)凭借其跨设备协同、分布式软总线以及声明式 UI 开发框架 ArkUI,为这类注重"轻量化交互 + 即时反馈"的生活方式类应用提供了极为理想的生长土壤。本应用正是一款面向"晨间场景"深度打磨的习惯追踪工具。它聚焦

2301_79516720的博客 165
上一篇: Android Mobile Hotfix(阿里云——移动热修复接入)
下一篇: Android .9图片的作用与制作
Android_man_me
博客等级 码龄12年 10粉丝 11原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值