移动设备交互应用 实验三 我的校园(下)

简介: 移动设备交互应用 实验三 我的校园(下)

③成绩查询

同样地,成绩查询也采用了ListView以便于实际使用,由于前面介绍过,故不再详细说明。代码如下:5154fc64f9014222b89a08551802c862.png

94099be84a8e44bbb1d92bc0170758f3.png

24337c7c9bb44c5c890009ad74d2646c.png

e88154b6cde04046ad58e7f5c49bfa30.png

517090784112495bbed3695c8ef38077.png




2. 请详细说明“我的校园”APP的功能、出现的关键问题及解决方案


(1)主要功能:


①主页面


24112625060848768198d714a44d9f92.png


②登录功能:

效果如下:

f900511f4393418f9f66f8ba9c9dfbf7.png

57716d73129444f384646e8fa7b63e54.png


6268c6cc9bc14315a83ef5d4ca94c02d.png

039e72ee6f0744d6bbbc1ecb0dce9645.png


d530a9ed6b5a4ec68f3fd0605da31fae.png


④成绩查询:

点击“我的通知”即可查看成绩

b9d723f811a4445a957ba395d70f741b.png


(2)遇到问题及解决办法:

Q:ViewGroup为什么不会调用onDraw

A: 正常情况下,我们重写LinearLayout的onDraw方法,它是不会被调用的。下面将分析原因并做解释。

在完成主页面功能栏的布局中,遇到了问题重写LinearLayout的onDraw方法时不会被调用,从而导致错误。

   <com.test.demo.MyLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:id="@+id/ll_absolute"  
    android:orientation="vertical"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    android:background="#FF000000">  
</com.test.demo.MyLinearLayout>  


大概的代码层次是,MyLinearLayout从LinearLayout派生出来,然后在程序中重载OnDraw。但是,onDraw不会被调用。我们可能会遇到这个问题:如果不给LinearLayout设置一个背景,系统是不会调用onDraw时,也就是说,我们重写的onDraw是不会调用的。当设置一个背景后,onDraw就会被调用。

造成这种现象的原因是继承自LinearLayout,而LinearLayout这是一个容器,ViewGroup本身并没有任何可画的东西,它是一个透明的控件,因些并不会触发onDraw,但是如果给LinearLayout设置一个背景色,其实这个背景色不管你设置成什么颜色,系统会认为LinearLayout上面有东西可画了,因此会调用onDraw方法。

我们可以仔细分析View的源码,它有一个方法View#draw(Canvas)方法,这里面有两个地方调用onDraw,它的条件都是:if (!dirtyOpaque) onDraw(canvas);

也就是说,如果dirtyOpaque是true的话,onDraw就不会调用,而dirtyOpaque的值的计算代码如下:

final boolean dirtyOpaque = (privateFlags & DIRTY_MASK) == DIRTY_OPAQUE &&  
             (mAttachInfo == null || !mAttachInfo.mIgnoreDirtyState);  


此外,View还提供了一个重要的方法:setWillNotDraw:


  public void setWillNotDraw(boolean willNotDraw) {  
     setFlags(willNotDraw ? WILL_NOT_DRAW : 0, DRAW_MASK);  
 } 


通过查阅资料,得知如果想重写onDraw,应调用这个方法来清除flag,所以如果想要重写LinearLayout的onDraw,可以在其构造方法中调用setWillNotDraw方法。 在ViewGroup初始他时,它调用了一个私有方法:initViewGroup,其中setFlags(WILL_NOT_DRAW, DRAW_MASK); 相当于调用了setWillNotDraw(true),因此对于ViewGroup,它就认为是透明的了。

如果我们想要重写onDraw,就需要调用setWillNotDraw(false)


综上所述:

①ViewGroup默认情况下,会被设置成WILL_NOT_DRAW,这是从性能考虑,这样一来,onDraw就不会被调用了。

②如果要重写一个ViweGroup的onDraw方法,有两种方法:在构造函数里面,给其设置一个颜色,如#00000000或在构造函数里面,调用setWillNotDraw(false),去掉其WILL_NOT_DRAW flag。


三、实验总结


①透明进度条bug


我的透明进度条原理是不断重绘一个背景图片,然后使用Matrix旋转图片,原先的代码是死循环,代码如下:


protected Void doInBackground(Void... params) {  
    while( true ) {  
        try {  
            Thread.sleep(100);  
        } catch(InterruptedException e) {  
            e.printStackTrace();  
        }  
        publishProgress();  
    }  
    return null;  
} 


这样就有一个bug,因为是死循环,当ProgressDialog被dismiss掉之后这个循环并不会销毁,而是一直在循环,这样造成的一个bug就是使用了透明进度条之后侧滑菜单点击就没有反应了,并且,透明进度条在Activity下次启动并不会有旋转的效果,这里修改的办法是将这个while(true)改成判断while( mLoop ) 然后重写ProgressDialog的dismiss()方法:


public void dismiss() {  
     super.dismiss();  
     mProgressView.setLoop(false);  
 } 


②通过android绘图来绘课程表界面:


受超级课程表等APP的启发,我自学了android绘图,通过绘图,可以更美观的完成课程表的展示。

分析页面可知:

整个界面是一个垂直的LinearLayout布局,里面放着四个子View:使用include标签加载的布局,普通的LinearLayout,自定义View和周数,自定义View与课程表。

通过CourseDateUI和CourseUI完成绘制:


678d8a235c714a738255d4ce76e9ec07.png


295824ee8a11475ebf324b2f77b3a287.png

366658b12819459c93ba84c28488c598.png

bf94e8ea7fa34f3aa414853d949ca1b6.png

b19b6b3bb99840d9b2afa56888400f1f.png

③实验感想:


通过本次实验,我学会了如何完成不同设备的自适应,也学会了通过数据持久化技术完成登录与用户验证,以及各个文件图片的存储。

也学会了熟练使用UI开发,碎片,广播机制与数据持久化技术的各个知识点。更通过自学,学会了安卓绘图,完成了精美的课程表的制作。

相关文章
|
3月前
|
移动开发 Android开发 数据安全/隐私保护
移动应用与系统的技术演进:从开发到操作系统的全景解析随着智能手机和平板电脑的普及,移动应用(App)已成为人们日常生活中不可或缺的一部分。无论是社交、娱乐、购物还是办公,移动应用都扮演着重要的角色。而支撑这些应用运行的,正是功能强大且复杂的移动操作系统。本文将深入探讨移动应用的开发过程及其背后的操作系统机制,揭示这一领域的技术演进。
本文旨在提供关于移动应用与系统技术的全面概述,涵盖移动应用的开发生命周期、主要移动操作系统的特点以及它们之间的竞争关系。我们将探讨如何高效地开发移动应用,并分析iOS和Android两大主流操作系统的技术优势与局限。同时,本文还将讨论跨平台解决方案的兴起及其对移动开发领域的影响。通过这篇技术性文章,读者将获得对移动应用开发及操作系统深层理解的钥匙。
104 12
|
7月前
|
数据采集 数据可视化 测试技术
五台山风景区旅游模拟漫游系统的设计与实现_kaic
五台山风景区旅游模拟漫游系统的设计与实现_kaic
|
7月前
|
数据采集 搜索推荐 JavaScript
Uniapp连接iBeacon设备——实现无线定位与互动体验(理论篇)
Uniapp连接iBeacon设备——实现无线定位与互动体验(理论篇)
297 0
|
存储 安全 物联网
元宇宙技术搭建 | 虚拟交互系统开发技术讲解
目前,去中心化技术、电子游戏技术、人工智能技术、交互技术、物联网技术和网络及运算技术这些已有技术为元宇宙的实现和应用奠定了技术基础,同时元宇宙的实现也将促进其它技术的发展,如身份建模、关系建模、会话管理、资源管理、能耗管理、时空一致性、安全与隐私保护等。接下来我们将会一一解析这些技术。
|
XML 存储 数据库
移动设备交互应用 实验三 我的校园(上)
移动设备交互应用 实验三 我的校园(上)
185 0
移动设备交互应用 实验三 我的校园(上)
|
缓存 Java 测试技术
移动设备交互应用 实验一 熟悉Android编程开发环境
移动设备交互应用 实验一 熟悉Android编程开发环境
324 0
移动设备交互应用 实验一 熟悉Android编程开发环境
|
存储 开发框架 监控
全景虚拟漫游技术实现(three.js vs ThingJS) Javascript 3D开发 前端 物联网 webgl 三维建模 3D模型 虚拟 全景
在全景虚拟漫游场景上实现3D动效,ThingJS vs three.js开发性能和资源投入将会如何呢?
 全景虚拟漫游技术实现(three.js vs ThingJS) Javascript 3D开发 前端 物联网 webgl 三维建模 3D模型 虚拟 全景
|
JSON 数据可视化 JavaScript
基于WebGL无插件虚拟场景漫游关键技术(完整版)ThingJS
如果要构建一个具有交互性和拓展性的沉浸式漫游场景,常用到3DSMAX、three.js等软件技术,学习门槛较高;ThingJS可视化组件更加轻量化,B/S架构下的3D可视化应用构建更轻松,为不少企业客户降低了项目开发成本。
基于WebGL无插件虚拟场景漫游关键技术(完整版)ThingJS
《社交网站界面设计(原书第2版)》——1.9 为设备之间的空间进行设计
本节书摘来自华章计算机《社交网站界面设计(原书第2版)》一书中的第1章,第1.9节,作者:(美)克里斯蒂安·克鲁姆里什(Christian Crumlish),艾琳·马洛恩(Erin Malone)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1034 2
|
存储 传感器 数据可视化

热门文章

最新文章