当前位置:

首页 > 系统应用 > 2.2.4 FrameLayout(帧布局)

2.2.4 FrameLayout(帧布局)

本节引言 FrameLayout(帧布局)算得上六大布局里最容易理解的一种。它的逻辑很直接:先在屏幕上划出一块空白区域,往里面添加控件时,系统默认会把它们都堆到这块区域的左上角。也正因为这种布局几乎不提供复杂的定位能力,所以实际能派上用场的场景并不算多。帧布局本身的尺寸,通常由内部最大的那个子控件来

本文目录

    本节引言

    FrameLayout(帧布局)算得上六大布局里最容易理解的一种。它的逻辑很直接:先在屏幕上划出一块空白区域,往里面添加控件时,系统默认会把它们都堆到这块区域的左上角。也正因为这种布局几乎不提供复杂的定位能力,所以实际能派上用场的场景并不算多。帧布局本身的尺寸,通常由内部最大的那个子控件来决定;如果几个控件大小刚好一样,那么同一时刻往往只能看到最上层的那个,因为后添加进去的控件会直接覆盖前面的控件。当然,默认放在左上角并不是完全不能调整,借助layout_gra vity属性,也可以把控件放到其他位置。本节除了会演示一个最基础的示例之外,还准备了两个挺有意思的小例子,感兴趣的话可以继续往下看。

    1.常用属性

    FrameLayout的属性很少就两个,但是在说之前我们先介绍一个东西:

    前景图像:永远处于帧布局最上面,直接面对用户的图像,就是不会被覆盖的图片。

    两个属性:

    • android:foreground:*设置改帧布局容器的前景图像
    • android:foregroundGra vity:设置前景图像显示的位置

    2.实例演示

    1)最简单的例子

    运行效果图:

    实现代码如下:

        
        
            
             
        

    代码解析: 很简单,三个TextView设置不同大小与背景色,依次覆盖,接着右下角的是前景图像,通过 android:foreground="@drawable/logo"设置前景图像的图片, android:foregroundGra vity="right|bottom"设置前景图像的位置在右下角

    2)随手指移动的萌妹子

    效果图如下:

    实现流程解析:

    • step 1:先将main.xml布局设置为空白的FrameLayout,为其设置一个图片背景
    • step 2:新建一个继承View类的MeziView自定义组件类,在构造方法中初始化view的初始坐标
    • step 3:重写onDraw()方法,实例化一个空的画笔类Paint
    • step 4:调用BitmapFactory.decodeResource()生成位图对象
    • step 5:调用canvas.drawBitmap()绘制妹子的位图对象
    • step 6:判断图片上是否回收,否则强制回收图片
    • step 7:在主Ja va代码中获取帧布局对象,并且实例化一个MeziView类
    • step 8:会实例化的mezi对象添加一个触摸事件的监听器,重写onTouch方法,改变mezi的X,Y坐标,调用invalidate()重绘方法
    • step 9: 将mezi对象添加到帧布局中

    先看布局代码:main_activity.xml

        
        

    接下来是自定义的MeziView.ja va

    package com.jay.example.framelayoutdemo2;  
    import android.content.Context;  
    import android.graphics.Bitmap;  
    import android.graphics.BitmapFactory;  
    import android.graphics.Canvas;  
    import android.graphics.Paint;  
    import android.view.View;  
    public class MeziView extends View {  
        //定义相关变量,依次是妹子显示位置的X,Y坐标  
        public float bitmapX;  
        public float bitmapY;  
        public MeziView(Context context) {  
            super(context);  
            //设置妹子的起始坐标  
            bitmapX = 0;  
            bitmapY = 200;  
        }  
    //重写View类的onDraw()方法  
        @Override  
        protected void onDraw(Canvas canvas) {  
            super.onDraw(canvas);  
            //创建,并且实例化Paint的对象  
            Paint paint = new Paint();  
            //根据图片生成位图对象  
            Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.s_jump);  
            //绘制萌妹子  
            canvas.drawBitmap(bitmap, bitmapX, bitmapY,paint);  
            //判断图片是否回收,木有回收的话强制收回图片  
            if(bitmap.isRecycled())  
            {  
                bitmap.recycle();  
            }  
        } 
    }  

    MainActivity.ja va:

    package com.jay.example.framelayoutdemo2;  
    import android.os.Bundle;  
    import android.view.MotionEvent;  
    import android.view.View;  
    import android.view.View.OnTouchListener;  
    import android.widget.FrameLayout;  
    import android.app.Activity;  
    public class MainActivity extends Activity {  
    @Override  
        protected void onCreate(Bundle sa vedInstanceState) {  
            super.onCreate(sa vedInstanceState);  
            setContentView(R.layout.activity_main);  
            FrameLayout frame = (FrameLayout) findViewById(R.id.mylayout);  
            final MeziView mezi = new MeziView(MainActivity.this);  
            //为我们的萌妹子添加触摸事件监听器  
            mezi.setOnTouchListener(new OnTouchListener() {  
                @Override  
                public boolean onTouch(View view, MotionEvent event) {  
                    //设置妹子显示的位置  
                    mezi.bitmapX = event.getX() - 150;  
                    mezi.bitmapY = event.getY() - 150;  
                    //调用重绘方法  
                    mezi.invalidate();  
                    return true;  
                }  
            });  
            frame.addView(mezi);  
        }  
    }  

    代码解释: 见步骤,很简单,就是自定义一个View类,重写重绘方法,接着在Activity中为他添加一个触摸时间在触摸时间中重写onTouch方法获取点击焦点,另外还需要-150,不然那个坐标是自定义View的左上角,接着调用invalidate( )重绘方法,最后添加到帧布局中而已!

    代码下载:FrameLayoutDemo2.zip

    3)跑动的萌妹子

    效果图如下:

    实现流程:

    • step 1:定义一个空的FrameLayout布局,将前景图像的位置设置为中央位置
    • step 2:在Activity中获取到该FrameLayout布局,新建一个Handler对象,重写handlerMessage()方法,调用图像- 更新的方法
    • step 3:自定义一个move()方法,通过switch动态设置前景图片显示的位图
    • step 4:在onCreate()方法中新建一个计时器对象Timer,重写run方法,每隔170毫秒向handler发送空信息

    实现代码如下:

    布局文件:main_activity.xml:

        
    

    MainActivity.ja va:

    package com.jay.example.framelayoutdemo3;    
    import ja va.util.Timer;    
    import ja va.util.TimerTask;    
    import android.os.Bundle;    
    import android.os.Handler;    
    import android.os.Message;    
    import android.view.View;    
    import android.view.View.OnClickListener;    
    import android.widget.FrameLayout;    
    import android.app.Activity;    
    import android.graphics.drawable.Drawable;    
    public class MainActivity extends Activity {    
        //初始化变量,帧布局    
        FrameLayout frame = null;    
        //自定义一个用于定时更新UI界面的handler类对象    
            Handler handler = new Handler()    
            {    
                int i = 0;    
                @Override    
                public void handleMessage(Message msg) {    
                //判断信息是否为本应用发出的    
                    if(msg.what == 0x123)    
                    {    
                        i++;    
                        move(i % 8 );    
                    }    
                    super.handleMessage(msg);    
                 }    
            };          
    //定义走路时切换图片的方法    
        void move(int i)    
        {    
            Drawable a = getResources().getDrawable(R.drawable.s_1);    
            Drawable b = getResources().getDrawable(R.drawable.s_2);    
            Drawable c = getResources().getDrawable(R.drawable.s_3);    
            Drawable d = getResources().getDrawable(R.drawable.s_4);    
            Drawable e = getResources().getDrawable(R.drawable.s_5);    
            Drawable f = getResources().getDrawable(R.drawable.s_6);    
            Drawable g = getResources().getDrawable(R.drawable.s_7);    
            Drawable h = getResources().getDrawable(R.drawable.s_8);    
            //通过setForeground来设置前景图像    
            switch(i)    
            {    
                case 0:    
                    frame.setForeground(a);    
                    break;    
                case 1:    
                    frame.setForeground(b);    
                    break;    
                case 2:    
                    frame.setForeground(c);    
                    break;    
                case 3:    
                    frame.setForeground(d);    
                    break;    
                case 4:    
                    frame.setForeground(e);    
                    break;    
                case 5:    
                    frame.setForeground(f);    
                    break;    
                case 6:    
                    frame.setForeground(g);    
                    break;    
                case 7:    
                    frame.setForeground(h);    
                    break;    
            }    
        }    
    @Override    
        protected void onCreate(Bundle sa vedInstanceState) {    
            super.onCreate(sa vedInstanceState);    
            setContentView(R.layout.activity_main);    
    frame = (FrameLayout) findViewById(R.id.myframe);    
            //定义一个定时器对象,定时发送信息给handler    
            new Timer().schedule(new TimerTask() {    
    @Override    
                public void run() {    
                    //发送一条空信息来通知系统改变前景图片    
                    handler.sendEmptyMessage(0x123);    
                }    
            }, 0,170);     
        }    
    }    

    代码解析: 代码也很简单,就是定义一个handler对象来刷新帧布局的前景图像,定义一个Timer定时器每隔170毫秒发送定时信息,i++;move(i%8);这里是因为我们使用8个图片作为动画素材!

    代码下载:FrameLayoutDemo3.zip

    本节小结

    本节介绍了下FrameLayout(帧布局),主要掌握foreground和foregroundGra vity属性的使用即可!帧布局比前面的表格布局用得稍微多一点!有兴趣可以像笔者这样写点小例子试试!

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    系统应用
    相关文章 更多
    Yandex浏览器官网登录与在线体验入口
    Yandex浏览器官网登录与在线体验入口

    Yandex浏览器官方网站登录入口是https://www.yondex.net/,提供多语言下载、账户同步、广告拦截、Turbo模式及隐私保护等功能,支持跨设备数据同步与安全浏览。

    2026年AO3镜像最新地址及稳定入口
    2026年AO3镜像最新地址及稳定入口

    ao3镜像2026最新入口包括主站archiveofourown.org、镜像站ao3mirror.com和xiaozhan.icu,建议收藏备用并根据网络情况切换使用。

    Win10搜索不到蓝牙耳机的排查与连接方法
    Win10搜索不到蓝牙耳机的排查与连接方法

    面向在Windows 10系统中无法发现蓝牙耳机的用户,本文提供从耳机配对模式到系统设置的完整排查路径。首先确保耳机已充电并进入可被搜索的配对状态,断开与其他设备的连接;随后在Win10设置中开启蓝牙并添加设备。若蓝牙开关缺失或适配器异常,需通过设备管理器检查驱动状态并更新,以恢复正常的蓝牙音频设备识别功能。

    Win10蓝牙耳机麦克风没声音?检查输入设备与权限设置
    Win10蓝牙耳机麦克风没声音?检查输入设备与权限设置

    面向在Windows 10系统中遇到蓝牙耳机能听声但无法录音的用户,本文解决因输入通道选择错误、隐私权限关闭或语音连接缺失导致的麦克风无声问题。关键步骤包括:在系统声音设置中正确选择Headset Microphone或Hands-Free AG Audio作为输入设备;在隐私设置中开启应用访问麦克风权限;确认蓝牙状态包含语音连接而非仅音乐连接,必要时重新配对或更新驱动。注意Stereo模式不支持麦克风输入,勿为音质牺牲通话功能。

    Win11打开服务管理器的两种方法:运行命令与计算机管理
    Win11打开服务管理器的两种方法:运行命令与计算机管理

    面向需要在Windows 11中查看或配置系统服务的用户,本文提供两种快速进入服务管理器的路径。一是通过Win+R运行services.msc直接打开,适合快速访问;二是从开始菜单进入计算机管理,再展开服务和应用程序找到服务列表,适合在统一管理界面中操作。文中说明查看状态通常无需特殊权限,而修改服务设置可能需要管理员账户,帮助用户根据实际需求选择合适入口。

    fences怎么彻底删除 清理残留文件
    fences怎么彻底删除 清理残留文件

    想知道Fences怎么彻底删除?本教程详解Windows 11下卸载Fences、使用官方Purge工具清理残留、删除布局备份及日志的步骤,助您干净移除软件并恢复桌面原生体验。

    Win11打开组策略的命令及家庭版无法使用说明
    Win11打开组策略的命令及家庭版无法使用说明

    面向需要在Windows 11中调整系统设置的用户,介绍通过运行命令gpedit.msc快速打开本地组策略编辑器的方法。该功能仅内置于专业版、企业版和教育版,家庭版通常不包含此工具,运行报错并非系统故障。本文详解正确的命令输入格式、界面确认方式以及通过任务栏搜索的替代路径,并指导家庭版用户如何查看系统版本以选择对应的设置入口或升级方案。

    Win11家庭版找不到组策略编辑器怎么办
    Win11家庭版找不到组策略编辑器怎么办

    面向使用Windows 11家庭版或家庭中文版的用户,解决运行gpedit.msc提示找不到文件的问题。该现象源于版本功能限制,修改文件名或重装同版本系统均无效。本文指导用户先通过“设置-关于”确认系统版本,日常配置优先在“设置”应用中完成;若确需本地组策略功能,建议通过官方渠道升级至专业版,并警示避免使用来源不明的第三方安装工具。

    fences怎么退出 关闭后台运行程序
    fences怎么退出 关闭后台运行程序

    想让 Fences 暂时停止接管桌面?本文详解 Windows 11/10 下关闭 Fences 总开关、禁用开机启动及验证后台状态的操作步骤,区分临时停用与彻底卸载,确保桌面文件安全。

    电脑黑屏图片有哪些类型?纯黑壁纸与故障画面辨别方法
    电脑黑屏图片有哪些类型?纯黑壁纸与故障画面辨别方法

    分不清电脑黑屏是设置了纯黑壁纸还是系统故障?本文详解纯黑壁纸的视觉特征与故障黑屏的区别,提供Windows和Mac系统的纯黑壁纸设置方法,助你快速判断屏幕状态。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。