全部 文章 问答 分享 共找到48个相关内容
[文章] 怎样成为某一领域的顶尖高手?
但是我们在日常的生活中观察,生活中不缺乏一万小时的人,比如有些人天天打麻将一定超过一万小时,可是还是他们并没有成为一个高手。所以这其中一定有什么误区,一万小时只是其中一个条件,也不是必须。
[文章] 【拉大锯】程序员的日常:特斯拉可以识别到你假人,所以没能自动刹停!
【拉大锯】程序员的日常:特斯拉可以识别到你假人,所以没能自动刹停!这是啥玩意呢?今天有客户反应,我们做的老人摔倒报警没有起作用。我就回复他:我们的手表很只能的,发现你在假摔,所以不会报警。
2021-03-08 17:31 · 程序员的日常 / 翻车 / 快递 / 洗发液 / 特斯拉
[文章] Android系统编译日常记录
Android系统编译日常记录记录一下,有时候不常编译的话,有些东西会忘记的。
2019-08-31 10:21 · 安卓系统 / 编译 / 经验 / 系统定制 / AOSP
[文章] 自定义控件手表相关的素材和图解
表盘背景okay在线课程地址,请参考这里阳光沙滩程序拉大锯
[问答] 内容提供者无用?
跟着老拉大锯编写的获取媒体库图片代码,结果在虚拟机上实现了,真机上未实现。如图,虚拟机弹出来了选择了允许所以后面获取到了内容。真机上没弹出了,所以后面也没获取到内容。求没弹出的原因
2020-04-28 00:29 · 内容提供者
[文章] 2019年10月10日,这期更新了什么内容呢?
实现了关注的功能,但是没有看关注列表,下一期补上;首页的粉丝数已经可以更新;解决了找回密码发送验证时提示该手机号码已经注册的问题;添加了村模块,只能看,还不能用;修复了无法进入个人中心的问题(待测试)
2019-10-10 22:39 · 公告 / 程序员 / 更新说明
[文章] 程序员的日常(2021-2-25)
程序员的日常(2021-2-25)今天上班的路上,看到boss直聘的广告。我想起大秦帝国的范睢,那就说说今天想到跟历史相关的事情吧。为什么会想到范睢呢?因为有一段是范睢找秦昭襄王的时候,是直接面试。
2021-02-25 11:23 · 历史 / 嬴政 / 朝代 / 康熙 / 朱元璋
[文章] 【程序员拉大锯】程序员的日常(2021-3-3)
【程序员拉大锯】程序员的日常(2021-3-3)今天天气不错!阳光明媚,还TM有点晒!暂时不想写代码,来水一篇文章压压惊!福布斯2021排行榜这几天比较火的福布斯排行榜,更新了世界富豪的排名。
2021-03-03 18:36 · 日常 / 程序员 / 扯蛋 / 再扯蛋 / 蛋疼
[文章] 【拉大锯】程序员的日常,寄快递为什么没来取件就扣钱了?(2021-3-7)
【拉大锯】程序员的日常(2021-3-7)终于下暴雨了!特别喜欢下雨,睡觉特别舒服!别误会,就睡觉,不干别的!最近使用到的库侧滑删除好多人的侧滑删除,都是侧滑,然后要你确定是否删除的!
2021-03-07 11:43 · 日常
[文章] Android开发日常-编写一个登录界面
Android开发日常-编写一个登录界面看完这篇文章你可以学到什么知识呢?自定义组合控件封装view,只暴露接口,模块独立,设计思想。
2019-08-30 23:53 · 安卓 / UI / 布局 / 应用开发
[文章] Android开发日常-编写一个登录界面
Android开发日常-编写一个登录界面看完这篇文章你可以学到什么知识呢?自定义组合控件封装view,只暴露接口,模块独立,设计思想。
2019-10-23 10:28 · android / 组合控件 / 安卓开发 / 布局 / demo
[问答] 电脑显示器哪家强
准备购入一款显示器,日常视频、非竞技类游戏、代码和上网使用。对刷新率也没有任何要求。对分辨率没有什么概念,2k4k也没用过,也可以试一试。大家也没有推荐的显示器呀!
2020-03-03 11:34 · 显示器 / 猿日常
[分享] 让PPT演示更精彩
里面有大量的素材,动画等等,满足日常工作演示的需求。
2019-09-27 21:55 · PPT / 演示 / 办公
[文章] ios 阳光沙滩客户端挖坑
背景日常使用iPhone,不方便摸鱼,想在iPhone上面摸鱼,想要好的体验,不想用flutter,那就想办法开发原生的。登录登录能用了。文章列表文章,也勉强能用,后面再把ui整整。
2022-01-04 17:46 · ios / swift / 阳光沙滩客户端
[分享] 2020年,你必须知道的JS数组技巧
这篇文章,向大家展示了在日常开发中,数组有哪些奇淫技巧值得关注和学习,让我们开始吧!
2020-02-19 14:42 · js / 前端 / JavaScript / 技巧 / 经验
[文章] android gradle的日常使用
1.修改Gradle文件的存放位置默认情况下,androidstudio中gradle存放本地C:\Users\用户名.gradle文件夹下,下面存放着不同版本的gradle文件,如果想要修改存放位置可以在File>setting>Build,Execution,Deployment>BuildTools>gradle下2.gradle的兼容问题说完gradle文件存放的位置,不得不说一下下面这张图中的文件,这个文件夹包含了一个wrapper文件夹,那么为什么要有这个呢?gradle是一门发展很快的语言,语言发展快,api也就会经常更新,构建语言含有丰富的插件,变化很快的话,就难以兼容以前老的版本。而wrapper就用来解决解决兼容性问题。wrapper里定义了gradle的版本。distributionBase=GRADLE_USER_HOMEdistributionPath=wrapper/distsdistributionUrl=https\://services.gradle.org/distributions/gradle-6.8-bin.zipzipStoreBase=GRADLE_USER_HOMEzipStorePath=wrapper/dists我现在这个项目用的gradle版本是6.8,构建这个工程时,它都会用我所绑定的gradle版本(避免版本兼容性问题)所以wrapper的作用就是会来检查在你构建这个工程的机器上有没有6.8这个版本。如果有就开始构建,没有就去下载这个版本。再举个例子,假如你现在从网上下载了一个项目,而这个项目它所绑定的gradle版本是6.8的,而你的机器现在只有6.8版本的gradle,那么当这个项目在你这台机器上构建的时候,wrapper就会看你机器上有没有6.8版本的gradle,发现没有的话就会去到所提供的url下载这个版本。这个文件夹最主要的作用就是,当你clone了别人的项目,你网络又不好时,可以修改gradle的版本,使用本地已经下载好的gradle,让项目顺利构建。同时也可以避免本地下载一堆的gradle,占用磁盘空间。写这篇文章才发现,我已经下载了那么多3.Androidgradleplugin(gradle插件简称AGP)和gradle的关系对照您可以在AndroidStudio的File>ProjectStructure>Project菜单中指定Gradle版本,也可以使用命令行更新Gradle版本。官网链接4.常用的gradle命令4.1编译并生成相应的apk文件./gradlewclean清除/app目录下的build文件夹./gradlewbuild//依赖并编译打包./gradlewassembledebug//打debug包./gradlewassemblerelease//编译并打release的包./gradlewinstallrelease//release模式打包并安装./gradlewuninstallrelease//卸载release模式包./gradlewbuild--refresh-dependencies//刷新项目依赖//编译并打印日志./gradlewbuild--info//译并输出性能报告,性能报告一般在构建工程根目录build/reports/profile./gradlewbuild--profile//调试模式构建并打印堆栈日志./gradlewbuild--info--debug--stacktrace//强制更新最新依赖,清除构建并重新构建./gradlewcleanbuild--refresh-dependencies4.2.任务查询命令//查看任务./gradlewtasks//查看所有任务,包括缓存任务.gradlewtasks-all//针对某个module[modulename]的某个TaskName运行.gradlew:modulename:taskName说明,module定义在工程根settings.gradle下,由include指定子模块任务,不代表工程根也有同样的任务,所以需要单独查询moduel最佳命名实践为全小写英文防止编译兼容问题。4.3查看包依赖./gradlewdependencies//查看模组的依赖./gradlewapp:dependencies//检索依赖库.gradlewapp:dependencies|grepCompileClasspath//windows环境下.gradlewapp:dependencies|findstr"CompileClasspath"//将检索到的依赖分组找到比如multiDebugCompileClasspath就是multi渠道分发的开发编译依赖./gradlewapp:dependencies--configurationmultiDebugCompileClasspath//一般编译时的依赖库,不是固定配置方式,建议检索后尝试./gradlewapp:dependencies--configurationcompile//一般运行时的依赖库,不是固定配置方式,建议检索后尝试./gradlewapp:dependencies--configurationruntime4.4统计task时长gradle构建项目是将项目分成一个个的task的构建,通常为了分析哪个task花费了较长时间,需要我们自己写一些类来得到不同task的时长,好做针对性优化,这里有篇博客写的比较好,敢兴趣的直接跳转。统计task时长4.5有用的小技巧有用的技巧1.resolutionStrategy统一全局第三方库版本2.修改包的输出路径3.找到版本冲突的库4.修改依赖方式5.gradle.properties文件AS项目的根目录下有一个gradle.properties文件,专门用来配置全局键值对数据的。可用于存放敏感数据。将它从git版本控制中排除,这样gradle.properties文件只能保留在本地,从而不用担心keystore文件等敏感信息泄漏。常见的配置如下#Project-wideGradlesettings.#IDE(e.g.AndroidStudio)users:#GradlesettingsconfiguredthroughtheIDE*willoverride*#anysettingsspecifiedinthisfile.#Formoredetailsonhowtoconfigureyourbuildenvironmentvisit#http://www.gradle.org/docs/current/userguide/build_environment.html#Whenconfigured,Gradlewillruninincubatingparallelmode.#Thisoptionshouldonlybeusedwithdecoupledprojects.Moredetails,visit#http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects#org.gradle.parallel=true#为Studio分配默认的内存大小org.gradle.jvmargs=-Xmx2048m#表示使用AndroidXandroid.useAndroidX=true#表示将第三方库迁移到AndroidXandroid.enableJetifier=true#如果不设置为false,在某些机型上将不被允许安装android.injected.testOnly=false同时配合BuildConfig可以定义一些常量,如果你的app有两以上不同的环境运行,那么可以尝试一下这种方式定义baseUrl第一步:在app/build.gradle设置BuildConfigandroid{...buildTypes{release{minifyEnabledtrueproguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'//buildConfigField用于给BuildConfig文件添加一个字段,baseUrl为键,后面的${releaseUrl}为值buildConfigField("String","baseUrl","\"${releaseUrl}\"")}debug{buildConfigField("String","baseUrl","\"${debugUrl}\"")}}...}第二步:取值定义在gradle.properties文件中。debugUrl=https://xxxdebug.comrealeaseUrl=https://xxxrelease.com使用(你可以在项目中任意位置以BuildConfig.key的形式调用在buildConfigField上面定义的常量)Log.d("tag",BuildConfig.baseUrl)在debug环境下打印结果为https://xxxdebug.com在release环境下打印结果为https://xxxrelease.com这样就可以实现在不同包中使用不同的baseUrl.6.使用Gradle规定组件之间资源前缀通常我们的项目不是单个模块,分成了多个模块,因为我们拆分出了很多业务组件和功能组件,在把这些组件合并到**“app壳工程”时候就有可能会出现资源名冲突问题,例如A组件和B组件都有一张叫做“ic_back”的图标**,这时候在集成模式下打包APP就会编译出错,解决这个问题最简单的办法就是在项目中约定资源文件命名规约,比如强制使每个资源文件的名称以组件名开始,这个可以根据实际情况和开发人员制定规则。当然了万能的Gradle构建工具也提供了解决方法,通过在在组件的build.gradle中添加如下的代码://设置了resourcePrefix值后,所有的资源名必须以指定的字符串做前缀,否则会报错。//但是resourcePrefix这个值只能限定xml里面的资源,并不能限定图片资源,所有图片资源仍然需要手动去修改资源名。resourcePrefix"girls_"7.gradle警告配置//代码警告配置lintOptions{//禁用文本硬编码警告disable'HardcodedText'//禁用图片描述警告disable'ContentDescription'}8.build.gralde(project)8.1旧版本旧版本的build.gradle文件是这样的//Top-levelbuildfilewhereyoucanaddconfigurationoptionscommontoallsub-projects/modules.buildscript{ext.kotlin_version='1.5.10'ext.navigationVersion='2.3.1'//注释1:repositories{google()mavenCentral()jcenter()maven{url'https://jitpack.io'}maven{url"https://maven.aliyun.com/repository/public"}}dependencies{classpath"com.android.tools.build:gradle:4.0.2"classpath'org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31'classpath"com.tencent.bugly:tinker-support:1.2.3"//NOTE:Donotplaceyourapplicationdependencieshere;theybelong//intheindividualmodulebuild.gradlefiles}}//注释2:allprojects{repositories{google()mavenCentral()jcenter()maven{url"https://www.jitpack.io"}maven{url'https://jitpack.io'}maven{url"https://maven.aliyun.com/repository/public"}}}taskclean(type:Delete){deleterootProject.buildDir}注释1中buildscript中的声明是gradle脚本自身需要使用的资源。可以声明的资源包括依赖项、第三方插件、maven仓库地址等。而注释2在build.gradle文件中直接声明的依赖项、仓库地址等信息是项目自身需要的资源。8.2新版本build.gradle(project)plugins{id'com.android.application'version'7.1.2'applyfalseid'com.android.library'version'7.1.2'applyfalseid'org.jetbrains.kotlin.android'version'1.6.10'applyfalse}taskclean(type:Delete){deleterootProject.buildDir}上面使用了DSL写法,语法为plugins{id«pluginid»//(1)id«pluginid»version«pluginversion»[apply«false»]//(2)}pluginid和pluginversion是必需的且必须是常量,字面量,字符串.其他语句都是不允许的apply是可选的,默认是true;它是控制在应用插件的时候是否立刻使用插件的默认行为。这个plugins{}块是不能嵌套在别的配置块里的,必须是脚本的顶级模块。8.3应用插件到不同的模块(module)应用插件到子项目可以利用plugins{}的apply选项将插件应用到某些项目而不是所有项目里。默认plugins{}的插件是立即被解析并应用的。可以使用applyfalse告诉Gradle不应用到当前项目,然后在子项目的脚本中使用applyplugin<>或者plugins{}应用插件settings.gradle中include'helloA'include'helloB'include'goodbyeC'导入了3个模块然后在build.gradle中plugins{id'org.gradle.sample.hello'version'1.0.0'applyfalseid'org.gradle.sample.goodbye'version'1.0.0'applyfalse}subprojects{if(name.startsWith('hello')){applyplugin:'org.gradle.sample.hello'}}goodbyeC/build.gradleplugins{id'org.gradle.sample.goodbye'}上面的示例演示了如何给多个子项目分别应用不同的插件。8.4setting.gradle(旧版)include':app'rootProject.name="CustomView"8.5setting.gralde(新版)和旧版仅仅是管理项目和不同模块之间的关系不同,新的setting.gradle还添加了这个pluginManagementDSL是用来管理插件的,它可以配置插件,自定义仓库,自定义解析规则等。pluginManagement{}只能定义在两个地方:settings.gradle里,并且必须是第一个模块//插件管理pluginManagement{repositories{gradlePluginPortal()google()mavenCentral()}}//管理第3方依赖dependencyResolutionManagement{repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories{google()mavenCentral()}}rootProject.name="CustomView"include':app'另一个是init.gradle里settingsEvaluated{settings->settings.pluginManagement{plugins{}resolutionStrategy{}repositories{}}}9使用ext进行统一版本配置ext{android=[compileSdkVersion:29,buildToolsVersion:"30.0.2",applicationId:"com.xionggouba.bearseller",minSdkVersion:19,targetSdkVersion:30,versionCode:27,versionName:"3.9.1",defaultPublishConfig:'release',publishNonDefault:true,multiDexEnabled:true,mapKey:'c7e1ee468aa1bf8a6739',pushKey:'65aae199a0059eb1dbe7',pushChannel:'developer-default',]appid=[app:"com.xionggouba.bearseller",login:"com.huitao.login",home:"com.huitao.home",webview:"com.huitao.webview",main:"com.huitao.main",productManager:"com.huitao.productmanager",personal:"com.huitao.personalcenter",map:"com.huitao.map",bluetooth:"com.huitao.bluetooth",push:"com.huitao.push",markketing:"con.huitao.marketing",printer:"com.huitao.printer"]versions=["lifecycle_version":"2.2.0","arch_version":"2.1.0","retrofit_version":"2.6.2","dialog_version":"3.3.0","glide_version":"4.9.0","hilt":"2.28-alpha","kotlin_version":"1.4.10","fragment_version":"1.2.5","room_version":"2.2.6"]]通常为了方便版本管理,我们会在根目录下创建一个config.gradle文件,统一管理版本号,然后在build.gradle(project)下使用applyfrom"config.gradle"引入,然后使用,比如依赖room库implementation"androidx.room:room-runtime:$versions.room_version"10build.gradle(app)//该模块为应用程序模块,可以直接运行applyplugin:'com.android.application'android{//指定项目的编译版本,compileSdkVersion31//指定项目构建工具的版本buildToolsVersion"30.0.3"defaultConfig{//项目包名为com.example.testapplicationId"com.example.test"//最低兼容到Android5.0版本minSdkVersion21//指定已做过充分测试的目标版本targetSdkVersion25//版本号,这个是给开发者看的,以后应用升级都是以这个为准,范围大于1的整数versionCode1//这个是版本名称,给用户看的,versionName"1.0"testInstrumentationRunner"android.support.test.runner.AndroidJUnitRunner"//仅保留中文语种的资源resConfigs'zh,zh-rCN'//仅保留xxhdpi图片资源(目前主流分辨率1920*1080)resConfigs'xxhdpi'ndk{//设置支持的SO库架构,目前上支持armeabi-v7a,和arm64-v8a就可以运行在大部分手机上了//abiFilters'arm64-v8a','x86_64','armeabi',abiFilters'arm64-v8a','armeabi-v7a'//,'armeabi-v7a'//'x86_64',,}}//配置签名/***Linux或者Mac*gradleassembleRelease生成release版本*gradleassembleDebug**win*gradlewassembleRelease生成release版本*gradlewassembleDebug**/signingConfigs{release{keyAlias'android'//随便起keyPassword''//生成签名是的密码storeFilefile('../mobile-app.jks')//签名文件storePassword'adsda2++'//你自己的密码v1SigningEnabledtrue//v1签名v2SigningEnabledtrue//v2签名}debug{keyAlias'ttyh.android.key'keyPassword'adsda2++'//你自己的密码storeFilefile('../mobile-app.jks')storePassword'ttyh-123456++'v1SigningEnabledtruev2SigningEnabledtrue}}//打包偏好设置buildTypes{//指定生成正式版安装文件的配置release{//代码不进行混淆minifyEnabledfalse//压缩文件zipAlignEnabledtrue//移除无用的resource文件shrinkResourcesfalse//指定混淆的规则文件,proguard-android.txt为默认的混淆文件,定义了一些通用的混淆规则;//proguard-rules.pro文件位于当前项目的根目录下,定义一些项目特有的混淆规则。proguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'}//指定测试版的安装文件配置debug{minifyEnabledfalsesigningConfigsigningConfigs.debugproguardFilesgetDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro'}}productFlavors{urlDebug{signingConfigsigningConfigs.debug//引用前面的签名配置//测试环境Url,指定不同环境下的域名,到时可以通过BuildConfig.SERVER_URL获取到域名buildConfigField'String',"SERVER_URL",'\"https://xxx.com'}urlRelease{signingConfigsigningConfigs.release//生产环境UrlbuildConfigField'String','SERVER_URL','\"https://xxx.com'}}//不同资源文件尺寸的偏好flavorDimensions'default'//kotlin1.1.4开始,新增3个特性,要开启这3个特性,需要下面的设置//1.任何类中view属性都会被缓存为ViewHolder;//2.提供@Parcelize可以让任何类以一种简单的方式实现Parcelable//3.还有一种方法可以自定义生成的缓存androidExtensions{experimental=true}//使用viewbindingbuildFeatures{viewBindingtrue}//确定java版本compileOptions{sourceCompatibilityJavaVersion.VERSION_1_8targetCompatibilityJavaVersion.VERSION_1_8}kotlinOptions{jvmTarget="1.8"}sourceSets{main{jniLibs.srcDirs=['libs']}}}10.sourceSet强大的gradle,通过sourceSets可以让开发者能够自定义项目结构,如自定义assets目录、java目录、res目录,而且还可以是多个,但要知道的是,sourceSets并不会破坏变体的合并规则,它们是分开的,sourceSets只是起到了“扩充”的作用。这里先摆一下sourceSets的常规使用:sourceSets{main{manifest.srcFile'AndroidManifest.xml'java.srcDirs=['src']aidl.srcDirs=['src']renderscript.srcDirs=['src']res.srcDirs=['res']assets.srcDirs=['assets']}}对于多渠道共用同一套assets资源文件这个问题,结合sourceSets,我们可以这么处理,步骤如下:把共用的assets资源存放到一个渠道目录下,如free/assets。修改sourceSets规则,强制指定china渠道的assets目录为free/assets。sourceSets{china{sourceSet.assets.srcDirs=['src/free/assets']}}参考文章:-gradle插件-《AndroidGradle权威指南》-sourceSets在多渠道打包中的作用-Gradle7.1+新版本依赖变化-android多渠道打包
2022-09-30 10:44 · android / gradle
[文章] 日常错误记录第一期
意外的元素意外的元素(uri:"",local:"base-extension")。所需元素为<{}codename>,<{}layoutlib>,<{}api-level>我修改了gradle的版本好了。Android不会自动导包也不报错这个问题我设置了autoimport,但是还是不会自动导包,也不包错。原因是插件不兼容,或者老旧的问题,把butterknife插件删除就好了。Android4.2.1Gradle没有task,打包不了aar库解决方法打开设置,找到Experimental里,去掉上图中的那个勾点击gradle,就有了。Mqtt,EOFExceptiononIotDisconnected...已断开连接(32109)-java.io.EOFException我这里报这个错是因为连接ID重复了Gson解析jsonGson解析json时,bean注意了,不要混淆了,否则无法赋值。它是通过反射的方式去给字段赋值的。Nuxt.js多环境开发的时候,我们有dev环境,测试的时候我们有test环境,上线的时候我们有prod环境通常来说,我们会连接到不同的服务器上。如果根据不同的启动方式来使用不同的服务器地址呢?前置条件安装cross-envnpminstallcross-env--save脚本在package.json中生产模式的"build":"cross-envNODE_ENV=prodnuxtbuild",开发的脚本"dev":"cross-envNODE_ENV=devnuxt",测试的脚本:"test":"cross-envNODE_ENV=testnuxtbuild",也就是我使用不同的方式启动,这个NODE_ENV的值就不一样,build则是prod,dev则是dev,test构建则是test这样子,前置的环境就有了。如何获取到当前的环境呢?process.env,注意,不要写错,evn。不同环境下的值我们创建一个env.js的文件,名字你随便取:以上是我的url的配置,我只配置了开发环境和生产环境。配置环境中的常量我们可以拿到了对应的env,那么还没有我们的url值呢,需要配置一下。首先在nuxt.config.js导入env.js文件,然后添加以下配置importenvfrom'./env';module.exports={env:{BASE_API:env[process.env.NODE_ENV].BASE_API,ACCOUNT_PATH:env[process.env.NODE_ENV].ACCOUNT_PATH,UCENTER_PATH:env[process.env.NODE_ENV].UCENTER_PATH},.....}这个能看懂吧,到这里就配置好了,注意层级不要放错,单词不要写错。图片加水印有同学在群里说我们的文章被别人全部复制,并且转成了原创。有如此不要脸的同行,那么我们就做一下水印吧。//读取图片流java.awt.Imageimage=ImageIO.read(inputStream);//获取图片的宽intimgWidth=image.getWidth(null);//获取图片的高intimgHeight=image.getHeight(null);log.info("imgWidth==>"+imgWidth);log.info("imgHeight==>"+imgHeight);intangel=45;//旋转角度//每个水印水平间隔,我打算一行4个的样子intxpadding=imgWidth/4;//每个水印垂直间隔intypadding=imgHeight/4;//字体也要动态大小intfontSize=ypadding/6;//但是也不能太小if(fontSize<8){fontSize=8;}//创建一个空白的容器BufferedImagebi=newBufferedImage(imgWidth,imgHeight,BufferedImage.TYPE_INT_ARGB);//拿到画笔Graphics2Dg=bi.createGraphics();g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);//绘制原图片floatalpha=1F;AlphaCompositeac=AlphaComposite.getInstance(AlphaComposite.SRC_OVER,alpha);g.setComposite(ac);g.drawImage(image,0,0,imgWidth,imgHeight,null);//开始绘制水印//水印字体,我读取的是微软雅黑,我也不知道要不要钱,没查,哈哈。Fontfont=Font.createFont(0,this.getClass().getResourceAsStream("/msyh.ttc")).deriveFont(Font.BOLD,fontSize);g.setFont(font);FontRenderContextfrc=g.getFontRenderContext();TextLayouttl=newTextLayout(text,font,frc);//水印串宽度intstringWidth=g.getFontMetrics(g.getFont()).charsWidth(text.toCharArray(),0,text.length());//旋转水印g.rotate(Math.toRadians(angel),(double)imgWidth/2,(double)imgHeight/2);//水印透明度g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,0.4F));//字体色g.setColor(Color.gray);intx=-imgHeight/2;inty=-imgWidth/2;//循环绘制while(x<imgWidth+imgHeight/2){y=-imgWidth/2;while(y<imgHeight+imgWidth/2){Shapesha=tl.getOutline(AffineTransform.getTranslateInstance(x,y));g.fill(sha);y+=ypadding;}x+=stringWidth+xpadding;}//释放资源,我为什么要用byteArrayOutputStream,因为我不想写到文件,直接写到内存//弄完以后上传到COSg.dispose();ImageIO.write(bi,"PNG",byteArrayOutputStream);returnbyteArrayOutputStream.size();下面就传一张图试试看
2022-11-29 17:18 · 错误 / bug / 日常 / 经验 / 工具
[问答] 拉大锯老师,建议多一些安卓项目实战呢

领券联盟等收获非常大,学到了很多经验,体验到了从开发者角度审视我们日常使用的app,体验了上帝视角。

2021-09-02 19:07 · 建议
[问答] 这里是大学生职业规划访谈,想采访一下业内相关人士,谢谢大家!!
工作中日常面临的问题是什么,什么最有挑战性?或许方便透露一下,在您的工作领域里初级职位和略高级职位的薪水一般是什么水平吗?最后,能对在校学生说一两句重要的话吗?启示、警示或者随便什么都可以。
2020-01-01 17:20 · 访谈
[文章] 吐槽系列-2022苹果春季发布会
日常微信QQ知乎酷安bilibili所以我会选择iPhone11,应该满足我的需求了,再苟住,知道苹果出新的LCD全面屏。LCD永不为奴~
2022-03-09 11:02 · iPhone / 吐槽 / 苹果发布会
[文章] Android系统编译日常记录mtk平台
记录一下,有时候不常编译的话,有些东西会忘记的。编译的时候,把日志输出到build.log里面make-j402>&1|teebuild.log输出当前编译环境printconfig我们sourcebuild/envsetup.sh的时候,其实就是把envsetup.sh里的脚本当成shell命令去执行。所以这一步完成以后,我们才可以执行上面这些命令。比如说,launch、make、mm、mmm、这些命令都要执行sourcebuild/envsetup.sh以后才可以执行!也就是说,我们如果遇到一些不记得的命令,可以先去看看这个文件envsetup.sh里的shell脚本。如何能让系统编译默认打log和支持adb呢?修改以下这些项:build/core/main.mk#TargetismoredebuggableandadbdisonbydefaultADDITIONAL_DEFAULT_PROPERTIES+=ro.debuggable=10为false,1为true。也就是说1表示打开adb调试#Disabledebugginginplainuserbuilds.enable_target_debugging:=true这个是表示是否调试,true表示打开调试,false表示关闭调试。调试跟系统相关的app有些时候,我们开发的应用跟系统的服务有关联,如果没有编译出sdk来,用androidstudio就没法编译了。所以我们需要放到系统里面进行编译。按传统的做法:1、最笨的方法是:全编译,再刷机。虽然是增量编译,但是也要花费不少的时间。编译完成以后还要刷机。2、单独一个模块编译,再makesnod,再进行刷机。目前比较好的方法是怎么样的呢?模块编译成apk,使用覆盖的形式,省去了makesnod的时间(大概四分钟左右),省去刷机和第一次启动的时间(大概5分钟左右)这个编译命令是:mmWITH_DEXPREOPT=false-B进入到需要编译的目录模块,输入这个命令,就可以编译出对应的apk了,而不是apk+odex。有了apk之后,再去删除系统的,重启以后直接安装即可。把应用编译成apk在系统编译里头,默认会把应用编译成apk和odex,其中apk只有java编译出来的类,odex有资源文件如果要单独编译成一个apk的话,可以在mk文件里添加:WITH_DEXPREOPT:=false打开MTKlogadbshellamstart-ncom.mediatek.mtklogger/com.mediatek.mtklogger.MainActivity
[文章] 买电脑时,你应该了解的CPU知识!
酷睿i5:中高端定位,适合大部分日常应用,包括办公、娱乐和大多数现代游戏。酷睿i3:面向主流市场,满足日常办公、学习和一般家庭娱乐需求。
2024-02-19 11:57 · CPU / 组装机 / 电脑 / pc / 芯片
[文章] 博客系统前端nuxt构建docker镜像失败修复
背景日常升级博客前端,居然失败了。。。。。开始在问答区提问了,康师傅建议升级node。我刚开始也是想的,但是又不想升级,最后,还是升级。。。哈哈。懒。
2022-07-12 16:42 · node / nuxt / 博客系统
[文章] 【程序员的日常】活到老,赌到老
一位朴素老太太背包进曼哈顿银行,要存50万美金。总裁在VIP室接待。总裁:您老一生的积蓄?老太太:哪里?我豪赌为生,逢赌必赢,刚赢的!总裁:“不可能!”老太太:“那就赌一把吧,明早你的两个蛋蛋将变成方的,赌注就是这50万!”总裁迟疑不决,望着一袋现钞,还是决定应赌。老太太走后,总裁小心翼翼,不时伸手裤裆,摸摸圆圆的蛋,甚至晚上都没敢跟夫人同床。第二天约定的时间,老太太准时来到银行,旁边还站着一个穿着考究的青年。总裁奇怪。老太太说:这是我的律师,这么大宗的赌注,总要有个证人在场。总裁觉得言之有理。总裁得意洋洋地说:“你输了,我的蛋蛋还是圆的”。老太太说:我要亲自摸摸。总裁面有难色,但确实合情合理,想想50万现金还是咬牙答应。老太太边摸边说:果然圆的,我输了。总裁还没来得及高兴,就见旁边律师脸色铁青,不停以头撞墙,总裁大惊。律师:她昨天与我打赌150万,今天能摸到曼哈顿银行总裁的蛋蛋。”
2019-11-18 17:20 · 笑话 / 段子 / 搞笑 / 放松一刻 / 程序员日常
[文章] 来自深夜有感而发。希望大家引以为戒
唉,我总劝我朋友好好学一门技术,但我日常生活之后却仍然不勤勤恳恳地学习。我总以为我是孔乙己,与大众不同,失败的问题不在于我。
2021-03-27 01:28 · 思考
[文章] 我写文章的一些奇淫技巧
所以记录下来,以后遇到的时候去翻阅一下,也可以供别人参考;比如说:AOSP日记,修改分辨率,修改dpi,全屏禁止下拉拖出状态栏Android系统编译日常记录mtk平台系统编译,资源文件名不能为大写,编译报错这些都是我工作中
2019-11-09 11:59 · 经验 / 博客 / 文章 / 学习方法 / 分享
[文章] ios swift 项目创建和配置
背景最近阳光沙滩app安卓端已经做了一个小闭环,奈何自己一直用苹果手机📱,日常比较少带安卓手机,这样严重影响我摸鱼(学习先进摸鱼技术),今天突然立下牌坊,我要写一个ios阳光沙滩摸鱼客户端🐶,不知道能不能搞出来啊
2021-10-10 16:01 · ios / swift
[文章] docker基础
博客地址:村欢迎来友链呀。
2021-11-18 21:04 · docker
[文章] Android 动画切换背景图片的坑与修复
以上,就是程序员的日常。经过测试之后,反馈了一些问题,闪退了。
2022-07-18 17:23 · Android / glide / 动画切换背景
[文章] 我写的bug是如何让测试人员损失8.7元的?
程序员的日常发生这个事情以后,我发了个动态,不知道为什么会有人偷我的动态,还不屏蔽我!这篇文章本来是昨天发的,但是昨天凌晨已经发过一篇定评论组件的文章了,所以今天才发。
2022-07-02 20:31 · 日常 / bug / 工作 / 弹射下班 / 程序员
  • 1
  • 2