首页 文章 精选 留言 我的

精选列表

搜索[编写],共10014篇文章
优秀的个人博客,低调大师

Android开发实践:自己动手编写图片剪裁应用(2)

其实Android系统本身也提供了图片剪裁的模块,我们可以直接通过Intent来调用系统的图片剪裁功能,本文我们就先了解一下系统自带的图片剪裁功能是如何调用的吧。 得到被剪裁图片的URL地址 既然是图片剪裁,就一定要有被剪裁的图片,由于图片数据一般很大,为了防止内存溢出,普通APP与Android系统图片剪裁应用之间是通过URL来传递图片地址的。这个URL与我们常说见的网络URL不一样,它并不是HTTP开头,而是以file或者content开头的字符串,例如: 1 2 3 “file: ///sdcard/test.jpg” “content: //media/external/images/media/21936” 这里,我们首先介绍获取图片URL的方法: (1) 从SDCard中得到图片的URL 假设知道图片存放的路径位于“/sdcard/test.jpg”,那么,可以通过下面这种方式来得到URL: 1 UriimageUri=Uri.fromFile( new File( "/sdcard/test.jpg" )); 当然,如果图片是从网络获取的,并不存在于sdcard中,则可以先保存一份临时文件到sdcard中,再通过上述方法得到URL。 注:通过这种方式得到的URL,一般以“file://”开头。 (2) 从多媒体数据库中得到图片的URL Android系统会在后台定期扫描存储在系统中的多媒体文件,如:音乐、图片和视频等,相关的信息会存放在系统的多媒体数据库中,位于/data/data/com.android.providers.media/databases中,我们可以通过检索该数据库得到图片的URL(例如:通过检索数据库得到系统最后一次添加/修改的照片URL),也可以通过Intent.ACTION_PICK来调用系统的图片选择器来选择一张图片,图片选择器会将图片的URL地址放入Intent的data中返回。 后者的应用更多一些,我们主要介绍一下后者,即通过Intent.ACTION_PICK来得到图片URL地址,方法如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public void pickImage(){ Intentintent= new Intent(Intent.ACTION_PICK); intent.setType( "image/*" ); startActivityForResult(intent,REQUEST_CODE_PICK_IMAGE); } @Override protected void onActivityResult( int requestCode, int resultCode,Intentdata){ if (resultCode!=RESULT_OK){ return ; } if (requestCode==REQUEST_CODE_PICK_IMAGE){ UriimageUri=data.getData(); //...... } } 注:通过这种方式得到的URL,一般以“content://media”开头。 (3) 调用系统的相机拍一张照片 当然,被剪裁的图片也可以是通过Camera拍摄的一张照片,方法如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 UripictureURL=Uri.fromFile( new File( "/sdcard/temp.jpg" )); public void takenPicture(){ Intentintent= new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT,pictureURL); startActivityForResult(intent,REQUEST_CODE_TAKEN_PICTURE); } @Override protected void onActivityResult( int requestCode, int resultCode,Intentdata){ if (resultCode!=RESULT_OK){ return ; } if (requestCode==REQUEST_CODE_TAKEN_PICTURE){ UriimageUri=pictureURL; //...... } } 通过代码你可能已经注意到了,其实这种方式得到的图片URL,与第一种方式是一样的,通过图片的存储路径转化过来的,只不过传递给了系统Camera应用中。 2. 通过Intent调用系统的图片剪裁功能 有了图片的URL,调用系统的图片剪裁就很简单了,只需要构建一个Intent对象,并设置相关参数即可,用法示例如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 public void test(UriimageUri){ UricroppedUri=Uri.fromFile( new File( "/sdcard/cropped.jpg" )); startSystemCropImage(imageUri,croppedUri); } public void startSystemCropImage(Urisrc,Uridst){ Intentintent= new Intent( "com.android.camera.action.CROP" ); intent.putExtra( "crop" , "true" ); //设置剪裁图片的源/目的地址URL intent.setDataAndType(src, "image/*" ); intent.putExtra(MediaStore.EXTRA_OUTPUT,dst); //设置剪裁图片的宽高比 //intent.putExtra("aspectX",2); //intent.putExtra("aspectY",1); //固定剪裁图片的宽高值 //intent.putExtra("outputX",680); //intent.putExtra("outputY",480); //为了防止内存限制以及各个厂商返回的数据不统一,建议不要直接使用这个返回的数据,而是数据返回的URL intent.putExtra( "return-data" , false ); startActivityForResult(intent,REQUEST_CODE_SYSTEM_CROPPER); } @Override protected void onActivityResult( int requestCode, int resultCode,Intentdata){ if (resultCode!=RESULT_OK){ return ; } if (requestCode==REQUEST_CODE_IMAGE_CROPPER){ UricroppedUri=data.getExtras().getParcelable(MediaStore.EXTRA_OUTPUT); InputStreamin= null ; try { in=getContentResolver().openInputStream(croppedUri); Bitmapb=BitmapFactory.decodeStream(in); mImageView.setImageBitmap(b); } catch (FileNotFoundExceptione){ e.printStackTrace(); } } super .onActivityResult(requestCode,resultCode,data); } 3. 小结 注意添加读写SDCard的权限: 1 <uses-permissionandroid:name= "android.permission.WRITE_EXTERNAL_STORAGE" /> 本文转自 Jhuster 51CTO博客,原文链接:http://blog.51cto.com/ticktick/1602611,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android 动态壁纸(Live Wallpaper)编写注意事项小记

不要使用Thread 应直接使用Handler与Runnable接口对象组合运行。 使用Thread会产生一些莫名其妙的问题,比如:壁纸预览时报错;壁纸设置时报错;壁纸设置后闪一下即消失变为默认静态壁纸;壁纸设置后停止运行但切换到待机状态再切回还是能运行的。 当壁纸设置后消失时,在DDMS中看到产生的异常信息类似: 01-13 03:04:53.734: INFO/DEBUG(1856): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 01-13 03:04:53.734: INFO/DEBUG(1856): Build fingerprint: 'hkcsl_cht/htc_bravo/bravo/bravo:2.2/FRF91/236241:user/release-keys' 01-13 03:04:53.734: INFO/DEBUG(1856): pid: 2830, tid: 2867 >>> com.skyd.mantrawheel <<< 01-13 03:04:53.734: INFO/DEBUG(1856): signal 11 (SIGSEGV), fault addr deadbaad 01-13 03:04:53.734: INFO/DEBUG(1856): r0 00000000 r1 afd14699 r2 00000027 r3 00000074 01-13 03:04:53.734: INFO/DEBUG(1856): r4 afd42328 r5 00000000 r6 00000000 r7 0000a000 01-13 03:04:53.734: INFO/DEBUG(1856): r8 00000000 r9 48533900 10 485338d8 fp 000001e0 01-13 03:04:53.734: INFO/DEBUG(1856): ip 00001730 sp 48533590 lr deadbaad pc afd11cf0 cpsr 60000030 01-13 03:04:53.734: INFO/DEBUG(1856): d0 643a64696f72646e d1 6472656767756265 01-13 03:04:53.734: INFO/DEBUG(1856): d2 062b818b0627c18a d3 0633418d062f818c 01-13 03:04:53.734: INFO/DEBUG(1856): d4 0000018f0000018f d5 0000018f0000018f 01-13 03:04:53.734: INFO/DEBUG(1856): d6 be6659913f797051 d7 0000000043c24000 01-13 03:04:53.734: INFO/DEBUG(1856): d8 000001e000000000 d9 40790000000000a0 01-13 03:04:53.734: INFO/DEBUG(1856): d10 3fd34413509f79fe d11 bfe3441350ad386e 01-13 03:04:53.734: INFO/DEBUG(1856): d12 3ddb7cdfd9d7bdbb d13 0000000000000000 01-13 03:04:53.734: INFO/DEBUG(1856): d14 0000000000000000 d15 0000000000000000 01-13 03:04:53.734: INFO/DEBUG(1856): d16 018e41d4018e7b6a d17 018dcea8018e083e 01-13 03:04:53.734: INFO/DEBUG(1856): d18 018ed1b2018dd842 d19 0190c492018fcb22 01-13 03:04:53.734: INFO/DEBUG(1856): d20 0000000000000000 d21 0000000000000000 01-13 03:04:53.734: INFO/DEBUG(1856): d22 0000018f0000018f d23 0000018f0000018f 01-13 03:04:53.744: INFO/DEBUG(1856): d24 0000018f0000018f d25 0000018f0000018f 01-13 03:04:53.744: INFO/DEBUG(1856): d26 ffff19a8ffff19a8 d27 ffff19a8ffff19a8 01-13 03:04:53.744: INFO/DEBUG(1856): d28 0003e5c00003e5c0 d29 0003e5c00003e5c0 01-13 03:04:53.744: INFO/DEBUG(1856): d30 0001000000010000 d31 0001000000010000 01-13 03:04:53.744: INFO/DEBUG(1856): scr 60000012 01-13 03:04:53.814: INFO/DEBUG(1856): #00 pc 00011cf0 /system/lib/libc.so 01-13 03:04:53.814: INFO/DEBUG(1856): #01 pc 0000be62 /system/lib/libc.so 01-13 03:04:53.814: INFO/DEBUG(1856): #02 pc 0000cdc2 /system/lib/libc.so 01-13 03:04:53.814: INFO/DEBUG(1856): #03 pc 000008d8 /system/lib/libstdc++.so 01-13 03:04:53.814: INFO/DEBUG(1856): #04 pc 0004d3f8 /system/lib/libskia.so 01-13 03:04:53.814: INFO/DEBUG(1856): #05 pc 0006ad50 /system/lib/libskia.so 01-13 03:04:53.814: INFO/DEBUG(1856): #06 pc 0006d5b0 /system/lib/libskia.so 01-13 03:04:53.814: INFO/DEBUG(1856): code around pc: 01-13 03:04:53.814: INFO/DEBUG(1856): afd11cd0 2d00682d e029d1fb b12b68db c05cf8df 01-13 03:04:53.814: INFO/DEBUG(1856): afd11ce0 f8442001 4798000c e054f8df 26002227 01-13 03:04:53.814: INFO/DEBUG(1856): afd11cf0 2000f88e eee4f7fb f7fd2106 f04fe802 01-13 03:04:53.814: INFO/DEBUG(1856): afd11d00 91035180 460aa901 96012006 f7fc9602 01-13 03:04:53.814: INFO/DEBUG(1856): afd11d10 a905eb88 20024632 eb92f7fc eed0f7fb 01-13 03:04:53.814: INFO/DEBUG(1856): code around lr: 01-13 03:04:53.814: INFO/DEBUG(1856): deadba8c ffffffff ffffffff ffffffff ffffffff 01-13 03:04:53.814: INFO/DEBUG(1856): deadba9c ffffffff ffffffff ffffffff ffffffff 01-13 03:04:53.814: INFO/DEBUG(1856): deadbaac ffffffff ffffffff ffffffff ffffffff 01-13 03:04:53.814: INFO/DEBUG(1856): deadbabc ffffffff ffffffff ffffffff ffffffff 01-13 03:04:53.814: INFO/DEBUG(1856): deadbacc ffffffff ffffffff ffffffff ffffffff 01-13 03:04:53.814: INFO/DEBUG(1856): stack: 01-13 03:04:53.814: INFO/DEBUG(1856): 48533550 00000015 01-13 03:04:53.814: INFO/DEBUG(1856): 48533554 afd146c9 /system/lib/libc.so 01-13 03:04:53.814: INFO/DEBUG(1856): 48533558 afd425a0 /system/lib/libc.so 01-13 03:04:53.814: INFO/DEBUG(1856): 4853355c afd4254c /system/lib/libc.so 01-13 03:04:53.814: INFO/DEBUG(1856): 48533560 00000000 01-13 03:04:53.814: INFO/DEBUG(1856): 48533564 afd156e3 /system/lib/libc.so 01-13 03:04:53.814: INFO/DEBUG(1856): 48533568 afd14699 /system/lib/libc.so 01-13 03:04:53.814: INFO/DEBUG(1856): 4853356c afd14699 /system/lib/libc.so 01-13 03:04:53.814: INFO/DEBUG(1856): 48533570 00000074 01-13 03:04:53.814: INFO/DEBUG(1856): 48533574 afd42328 /system/lib/libc.so 01-13 03:04:53.814: INFO/DEBUG(1856): 48533578 00000000 01-13 03:04:53.814: INFO/DEBUG(1856): 4853357c 485335a4 01-13 03:04:53.814: INFO/DEBUG(1856): 48533580 0000a000 [heap] 01-13 03:04:53.814: INFO/DEBUG(1856): 48533584 afd1493b /system/lib/libc.so 01-13 03:04:53.814: INFO/DEBUG(1856): 48533588 df002777 01-13 03:04:53.814: INFO/DEBUG(1856): 4853358c e3a070ad 01-13 03:04:53.814: INFO/DEBUG(1856): #00 48533590 afd438e4 /system/lib/libc.so 01-13 03:04:53.814: INFO/DEBUG(1856): 48533594 afd1040c /system/lib/libc.so 01-13 03:04:53.814: INFO/DEBUG(1856): 48533598 afd42328 /system/lib/libc.so 01-13 03:04:53.814: INFO/DEBUG(1856): 4853359c 48e40628 01-13 03:04:53.814: INFO/DEBUG(1856): 485335a0 48e40628 01-13 03:04:53.814: INFO/DEBUG(1856): 485335a4 fffffbdf 01-13 03:04:53.814: INFO/DEBUG(1856): 485335a8 afd42328 /system/lib/libc.so 01-13 03:04:53.814: INFO/DEBUG(1856): 485335ac afd4372c /system/lib/libc.so 01-13 03:04:53.814: INFO/DEBUG(1856): 485335b0 48e40628 01-13 03:04:53.814: INFO/DEBUG(1856): 485335b4 afd0be67 /system/lib/libc.so 01-13 03:04:53.814: INFO/DEBUG(1856): #01 485335b8 48e40660 01-13 03:04:53.814: INFO/DEBUG(1856): 485335bc 00142180 [heap] 01-13 03:04:53.814: INFO/DEBUG(1856): 485335c0 00001404 01-13 03:04:53.814: INFO/DEBUG(1856): 485335c4 485338b0 01-13 03:04:53.814: INFO/DEBUG(1856): 485335c8 00000000 01-13 03:04:53.814: INFO/DEBUG(1856): 485335cc 48e40628 01-13 03:04:53.814: INFO/DEBUG(1856): 485335d0 48e40628 01-13 03:04:53.814: INFO/DEBUG(1856): 485335d4 00000000 01-13 03:04:53.814: INFO/DEBUG(1856): 485335d8 485338b0 01-13 03:04:53.814: INFO/DEBUG(1856): 485335dc afd0cdc5 /system/lib/libc.so 目前经过多次尝试仍未探知具体出错的地方。 可以指定一个Activity为动态壁纸设置界面 需在壁纸设置文件中这样指定: <?xml version="1.0" encoding="utf-8"?> <wallpaper xmlns:android="http://schemas.android.com/apk/res/android" android:author="@+string/author" android:description="@string/description" android:thumbnail="@drawable/mani1" android:settingsActivity="com.skyd.mantrawheel.Main" /> 并且该Activity必须在AndroidManifest.xml中这样注册: <activity android:name=".Main" android:label="@string/app_name"android:exported="true"></activity> 最好指定uses-feature标记 在AndroidManifest.xml中指定如下代码会使程序在市场中对不支持动态壁纸功能的用户隐藏: <uses-feature android:name="android.software.live_wallpaper" /> 必须在onCreate(SurfaceHolder surfaceHolder)中指定setTouchEventsEnabled(true); 如果你放在onSurfaceCreated(SurfaceHolder holder)中指定,你会很郁闷地发现动态壁纸在2.1版本的系统中可以运行,2.2版本却报错。 参考资料 http://www.androiddevblog.net/android/creating-android-live-wallpaper# http://code.google.com/p/krvarma-android-samples/source/browse/trunk/patternwallpaper/?r=80 本文转自斯克迪亚博客园博客,原文链接:http://www.cnblogs.com/SkyD/archive/2011/01/13/1934175.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Rust 编写的 Linux 网络驱动新增实验性补丁

Linux 内核在本周末新增了一组补丁,主要是为 Linux 网络设备驱动的 Rust 抽象打下基础,以便 Rust 代码能够用于构建新的网络设备驱动。这些补丁还包括一个虚拟的 Rust 网络驱动程序。 据介绍,长期内核开发者 Fujita Tomonori 在周日发布了这组补丁,包括提供网络设备驱动程序的 Rust 抽象和初始的 Rust 虚拟驱动程序,以帮助审查早期代码。到目前为止,网络子系统中 Rust 的实际硬件设备驱动程序还没有发布。 目前,这 800 行新 Rust 代码已发布到 rust-for-linux,以便在将其提交给更广泛的 Linux 网络驱动开发社区之前进行早期审查。 Linux 内核主线现在仍在继续进行许多不同的 Rust 工作,而到目前为止合并的主要是基础设施、子系统抽象,同时在等待任何值得关注的 Rust 驱动 —— 比如 Apple DRM 内核驱动,为上游做好准备。

优秀的个人博客,低调大师

Ambient 0.1 发布,Rust 编写的高性能多人游戏引擎

经过一年多的开发,Ambient 终于发布了 0.1 版本,这是一款采用 Rust 构建的开源多人游戏引擎。 据介绍,Ambient 是一个用于构建高性能多人游戏和 3D 应用程序的 runtime,使用了 WebAssembly 和 WebGPU 技术,与任何编译为 WebAssembly 或在 WebAssembly 上运行的语言兼容,旨在使构建和部署丰富的多人游戏世界和体验变得容易。其开发团队表示,通过Ambient,他们希望构建多人游戏与构建单人游戏一样简单。 特性 Seamless networking:Ambient 既用作服务器,同时也是客户端。开发者只需构建服务器和客户端逻辑,Ambient 可自动处理数据同步。 独立沙盒:开发者为 Ambient 构建的项目通过WebAssembly的隔离功能执行。因此如果出现崩溃,它不会破坏整个程序,这也意味着可以安全地运行不受信任的代码。 面向数据的设计:Ambient 的核心数据模型是每个 WASM 模块都可以操作的实体组件系统。 多语言:开发者能够使用任何可以编译为 WebAssembly 的语言构建 Ambient 模块(目前,Rust 是唯一受支持的语言,团队正在努力扩展到其他语言) 单一可执行文件:Ambient 是一个单一的可执行文件,可以在 Windows、Mac 和 Linux 上运行。它可以充当服务器或客户端。 互操作性:Ambient 允许定义自定义组件和 "concepts"(组件集合)。只要 Ambient 项目使用相同的组件和 "concepts",它们就能够共享数据和互操作。 Asset管道和流处理:Ambient 包含Asset 管道,支持编译多种 asset 格式,包括.glb和.fbx。asset 通过网络流式传输,因此客户端在加入时能够接收所需的一切数据。 强大的渲染器:Ambient 渲染器由 GPU 驱动,裁剪 (Culling) 和细节级别切换完全由 GPU 处理。默认情况下,它使用PBR,此外还支持级联阴影贴图和实例化所有可以实例化的东西。 示例 首先安装 Ambient,然后创建一个新的 Ambient 项目: ambient new 接着打开 _src/lib.rs_,将以下内容添加到 main 函数中,让 IDE 自动导入: spawn_query(player()).bind(move |players| { for _ in players { Entity::new() .with_merge(make_transformable()) .with_default(cube()) .with(translation(), rand::random()) .with(color(), rand::random()) .spawn(); } }); 这将为每个加入的玩家生成一个随机立方体(完整示例点此查看)。开始启动: ambient run 运行上述命令后会看到如下画面: 现在打开一个新的终端窗口,然后输入: ambient join 这时会看到两个框,也就意味已经成功使用 Ambient 构建了第一个多人游戏体验。 Ambient 开发团队介绍了创建项目的初衷,他们发现许多游戏引擎都针对构建单人游戏进行了优化,但很少有旨在简化多人游戏的游戏引擎。于是他们很好奇:如果要让多人游戏能像单人游戏一样容易使用,该如何构建?当开发者从网络的细节中解放出来时,可以想象怎样的非凡体验——新的和有趣的互动? Ambient 便是他们回答这些问题的开始:一个旨在让各种开发者能够构建和分享他们想要构建的体验的运行时。然而,这里的问题不仅仅在于做好客户端-服务器通信。它还包括多人游戏开发中出现的所有其他挑战:服务器资源、分发游戏、可持续地以服务形式运行游戏、与用户交互等等。运行时只是他们朝着这个方向迈出的第一步,接下来还要解决许多其他问题。 Ambient 采用了 MIT License,其团队表示,这是因为他们的目标是建立一个标准来让大家构建多人游戏。作为一家公司,他们的计划是为将采取“货币化”的运行时提供增值服务(包括服务器和资产托管),但运行时本身永远免费和开源。作为运行时的用户,他们可以选择使用 Ambient 团队提供的部分服务,以及选择自己实现其他服务。 未来,开发团队表示 Ambient 将会支持部署到 Web,支持更多可编译成 WebAssembly 的语言(目前只有 Rust),并提供协作编辑器。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册