Wallpaper模块(2)

134 篇文章 0 订阅
87 篇文章 1 订阅
Wallpaper模块(2):

WallPaperFragment extends ButtonReceiveFragment,
后者是项目的一个基础类,作用很简单,在被attach到某个Actviity时,如果Actviity
是一个ButtonProvider<也是项目实现,提供对onKeyDown/Up..的通告>,那么该fragment<Receiver>就会将自己register到该
Activity以在Activity收到onKeyDown时,会被通告并将自己popBackStackImmediate()<protected的,可以自己定制>.
这个baseClass的default实现的popBack功能是有点多余,在FragmentActivity本身就有这个逻辑,
不过这个baseClass的存在使得对于所有onKeyXXX事件的监听,是很有用的,在被Detach时会unregister。
WallPaperFragment比较简单,提供一个wallPagerList供用户选择,并且所选即所见,还提供了用户定制wallPaper<一部分逻辑>.
只记录一部分要点:

<1>wallpaper List直接用LinearLayout + HorizontalScrollView实现了,简单,虽然不如ListView那样会自动回收不可见的
View<convertView>, 不过考虑到这个List本身不长,所以接受.
List的每个Item也是一个复合View,动态从layout文件inflate然后addView.

<2>设计要求wallPaperList每次展现时都会自动scroll到当前被选中的wallpaper, 为了实现这个效果,这里使用了
ViewTreeOberver来检测wallPaperList的GlobalLayout<即代表List被重新的展现,比如旋转或者被attach到window或者尺寸变化>,
每次被layout<这一步callback晚于View的onLayout,但是够用>的时候就重新根据当前屏幕width/height,以及被选中的
wallPaper来计算应该scroll多少,并且将被选中的Item设为selected.
其实直接在onCreateView中这么做也可以,不过使用observer更为保险,View的size应该更准确一些,
onCreateView中得到的View的size不一定是最终呈现时的size.

<3>每次fragment的onCreateView时,都要重新根据持久化的wallpaperInfo重新生成一遍当前的wallpaper对应的Item并add到
List中<废话,每次onCreateView都是重新构造View>

<4>对于几个xml属性的使用:
(1)android:duplicateParentState,
一个包含了很多child的layout,有不同的selected/unselected状态,那么如果只改变layout的,下面的child的状态是不会被改变的,
如果code实现的话就比较麻烦,但是如果childView设了duplicateParentState="true",那么就可以自动复制parent的状态了.
(2)android:foreground, View的前景图<根据state不同有不同item>,
比如为了表示某个View被选中,会在这个View上面显示一个小图片表示被选中,
如果纯用辅助View+位移实现的话,会很麻烦。
foreground本身支持一个selector,根据不同的state<state_pressed/state_selected等以及自定义的>可以定制不同的drawable.很方便.

<5>善用View的tag:
(1)List里面的View都是动态inflate的,没有id,当然了可以通过setId来设置,不过setId有时候运气背可能正好和某个
现有的id冲突<id的具体数值是R类生成时决定的,id也只能是int>, 而在这些View被click时回调到onClick(View v),就无法判断哪个
View被click了,当然了你可以维护一份View引用和id的映射表,但是麻烦了点,这时候就可以使用View的tag了,
在inflate了View以后,就为该View set一个unique的tag,然后在onClick的时候取出tag<记住做类型转换>,根据tag就
可以知道哪个被点了.
这只是tag的一个小作用.

<6>目前设计和产品只要求保存一份自定义wallPaper,在List中显示的这一份自定义Bitmap是构造List Item时现裁剪的成的bitmap,
因此在每次detach时,都会手动将其recycle()<当然,不做后面也会释放,不过recycle这个函数能早跑就早跑>.
好的,我为您提供另一个程序题目: ## 程序题目:自动下载Bing每日壁纸 ### 问题描述 Bing每日壁纸是一个美丽的图片,每天都会更新。本程序旨在自动下载Bing每日壁纸,并保存到本地,以便用户使用。 ### 编程思路 本程序使用了以下知识点、库、模块、函数、数据结构、算法、语句等: - 知识点:网络爬虫、文件操作 - 标准库/扩展库:requests库、os库、datetime库 - 自定义函数:download_image() - 选择结构:if语句 - 循环结构:while语句 本程序首先使用requests库向Bing每日壁纸的API发送请求,获取当天的壁纸信息。我们通过解析返回的JSON数据,获取到壁纸的URL和名称。然后,我们使用os库创建一个名为"BingWallpapers"的文件夹,用于保存壁纸。接着,我们定义了一个函数`download_image()`,该函数接收两个参数,分别为壁纸的URL和文件名。在函数内,我们使用requests库下载壁纸,并将其保存到本地文件夹中。最后,我们使用datetime库获取当前日期,并输出下载成功的信息。 ### 程序代码 ```python import requests import os from datetime import datetime def download_image(url, filename): r = requests.get(url) with open(filename, "wb") as f: f.write(r.content) # 获取Bing每日壁纸的API url = "https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=en-US" # 发送请求并解析JSON数据 response = requests.get(url) data = response.json() url = "https://www.bing.com" + data["images"][0]["url"] filename = data["images"][0]["startdate"] + ".jpg" # 创建文件夹并下载壁纸 if not os.path.exists("BingWallpapers"): os.mkdir("BingWallpapers") download_image(url, os.path.join("BingWallpapers", filename)) # 输出下载成功信息 print("Bing wallpaper of {} has been downloaded successfully.".format(datetime.now().strftime("%Y-%m-%d"))) ``` ### 程序运行结果 ``` Bing wallpaper of 2022-07-10 has been downloaded successfully. ``` 以上是本程序的代码和运行结果。该程序可以自动下载Bing每日壁纸,并保存到本地文件夹中,方便用户使用。本程序使用了网络爬虫和文件操作等知识点,以及requests库、os库和datetime库等标准库/扩展库。其中,自定义函数`download_image()`用于下载壁纸,if语句用于判断是否需要创建文件夹,while语句可以用于循环下载多张壁纸。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值