Android学习笔记

AndroidAutoSize

集成非常简单,gradle引入以后,在manifest中,添加:

    <application>            
        <meta-data
            android:name="design_width_in_dp"
            android:value="360"/>
        <meta-data
            android:name="design_height_in_dp"
            android:value="640"/>           
     </application>          

就可以以宽度360dp的设计写ui,在不同的设备上相同的UI。

https://github.com/JessYanCoding/AndroidAutoSize

由Google Play签名app bundle

上传app bundle至Google Play,选择由Google Play签名。Google Play创建签名,本地打包时用本地创建的签名打包就可以,不必把本地签名上传至Google Play。上传的是本地签名的app bundle,Google Play重新对其签名。

参考:

https://developer.android.com/studio/publish/app-signing#generate-key

更新Android Studio及更新targetSdkVersion 33 后的问题解决

Invoke-customs are only supported starting with android 0 –min-api 26

https://stackoverflow.com/questions/49891730/invoke-customs-are-only-supported-starting-with-android-0-min-api-26

按照网上办法设java1.8,不起作用。最后按照编译时报错的最后一页,点击上面的解决方案,去设置,解决此问题。不明所以。

Unable to make field private final java.lang.String java.io.File.path accessible: module java.base does not “opens java.io” to unnamed module

修改Gradle Plugin版本与Gradle版本匹配。


修改gradle的java版本

gradle.properties

增加一行

org.gradle.java.home=

Apps targeting Android 12 and higher are required to specify an explicit value for android:exported when the corresponding component has an intent filter defined.

Manifest中启动activity增加android:exported

Flutter集成uni小程序(uniMP)踩坑

按照官方文档分别集成调试Android、iOS。

https://nativesupport.dcloud.net.cn/UniMPDocs/UseSdk/android.html

https://nativesupport.dcloud.net.cn/UniMPDocs/UseSdk/ios.html

Android

初始化SDK时报has leaked ServiceConnection io.dcloud.feature.unimp. that was originally bound here

不能在Activity中初始化,需要在Application中初始化,布造为什么。需要将APP的Application设为一个继承自FlutterApplication的类,在其中初始化uniMPSDK。

启动小程序报 运行路径中无uni小程序(__UNI_XXXXXXXX)应用资源,请检查应用资源是否正常部署

参照demo,在build.gradle中添加

    aaptOptions {
        additionalParameters '--auto-add-overlay'
        //noCompress 'foo', 'bar'
        ignoreAssetsPattern "!.svn:!.git:.*:!CVS:!thumbs.db:!picasa.ini:!*.scc:*~"
    }

iOS

初始化SDK时崩溃,报Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘*** -[NSBundle initWithURL:]: nil URL argument’

对照着demo将:

Link Binary With Libraries添加完整;

Copy Bundle Resources添加完整。

不知道是哪个操作使得不报错。

CentOS 7 vsftpd报331 Please specify the password. PASS ******** 530 Login incorrect. 问题解决

在阿里云上新开了个服务器,第一步搭建ftp可把我难住了,按照之前的日志,http://zhuqiaochu.truestudio.tech/%e9%98%bf%e9%87%8c%e4%ba%91centos%e6%90%ad%e5%bb%baftp/ 就是不行,报331 Please specify the password. PASS 530 Login incorrect.

闲话少叙,解决办法是:

编辑 /etc/pam.d/vsftpd 将 auth  required pam_shells.so 注释掉,然后重启vsftpd。

其原因是,默认配置只允许能shell的用户登录,但是创建ftp用户时,往往为了安全,禁止ssh登录,一般多为/usr/sbin/nologin,所以就无法登录了。所以把其注掉,就可以登录了。

参考:

https://blog.csdn.net/weixin_42272246/article/details/123631435

Android近期心得

RxPermissions

申请权限的,感觉不错。

Android sqlite批量insert

项目需要一次性插入大量数据,for循环一条一条insert,考虑到速度可能会比较慢,测试了一下速度,1w条耗时517秒。

查找资料,for循环前开启事务,结束后提交事务,速度提升至12.33秒。这个速度已经可以接受了。

再有可以分组,每组一条语句insert 400条数据(据说超过500条会报错),速度可以进一步大幅提升。由于上述方法速度已经可以满足需求,分组insert没有测试。具体可以参考:

https://www.jianshu.com/p/2a698774d950

Android使用IceDiscovery心得

需要引入IceDiscovery包:

    implementation group: 'com.zeroc', name: 'ice', version: '3.7.7'
    implementation group: 'com.zeroc', name: 'icediscovery', version: '3.7.7'

另外代码中需要配置:

initData.properties.setProperty("Ice.Plugin.IceDiscovery", "com.zeroc.IceDiscovery.PluginFactory");

注意参考官方demo

https://github.com/zeroc-ice/ice-demos/blob/4dd29c8cd7e3fa538706f68bfb0681dc7f0dd492/java/android/hello/src/main/java/com/zeroc/hello/HelloApp.java

Flutter新坑笔记

Exception in thread “main” java.util.zip.ZipException: zip END header not found

release报上述错误,解决办法是删除 root directory 下的 .gradle 文件夹。

cd ~
rm -rf .gradle

https://github.com/flutter/flutter/issues/73852

Dart笔记

一直稀里糊涂地用,没仔细学习一下。记录一下在官网学习的笔记吧。

sync* 、 async* 、yield

标记为sync*的函数返回一个Iterable,用例如下:

void main() {
  final numbers = getRange(1, 10);
  for (var value in numbers) {
    print('$value');
  }
}

Iterable<int> getRange(int start, int end) sync* { 
  for (int i = start; i <= end; i++) {
    yield i;
  }
}

async*和sync*类似,不过是异步的,返回值会被包裹在Stream中,用例如下:

Stream<int> countForOneMinute() async* {
  for (int i = 1; i <= 60; i++) {
    await Future.delayed(const Duration(seconds: 1));
    yield i;
  }
}

main() async {
  await for (int i in countForOneMinute()) {
    print(i); // 打印 1 到 60,一个秒一个整数
  }
}

函数

=> 表达式 是 { return 表达式; } 的简写

匿名函数

([[类型参数[, …]]) {
函数体;
}

运算符

~/ 除并取整

命名式构造函数

const double xOrigin = 0;
const double yOrigin = 0;

class Point {
  double x = 0;
  double y = 0;

  Point(this.x, this.y);

  // Named constructor
  Point.origin()
      : x = xOrigin,
        y = yOrigin;
}

Substance Painter学习笔记

视图操作改为和Blender一致

在这里插入图片描述

https://blog.csdn.net/ttm2d/article/details/104044207

基本操作

Blender学习笔记

基本操作快捷键(个人理解)

快捷键功能
按住鼠标中键拖动旋转视角
Ctrl(Command) + 鼠标中键上下拖动缩放(感觉滚轮滚动更常用)
Shift + 鼠标中键拖动拖动视角
Alt(Option) + 中键点击设点击点为视角中心点
按住鼠标中键拖动 后 按住Alt(Option)吸附45°滚动
按住Alt(Option) 后 按住鼠标中键拖动吸附180°滚动
Num1Y轴视角
Num3X轴视角
Num7Z轴视角
Num9180°切换视角
Num2,4,6,8不同方向旋转
Num5Perspective,Orthographic切换
Shift + 空格呼出快捷操作
Shift + 空格 后 B选择
B框选物体
C刷子选择
Shift + 空格 后 空格放置Cursor
Shift + 鼠标右键
放置Cursor(感觉这个更方便)
Shift + S 后选择可以设物体Origin为防止Cursor点
Shift + 空格 后 G选择物体并移动
上述过程中按住Ctrl按一定距离拖动
物体选中状态时 按 G 拖动鼠标移动物体
上述过程中按住中键吸附到xyz轴拖动
上述过程中按住Shift高精度拖动
Shift + 空格 后 R选择物体并旋转(注意,旋转白色圈是
按照当前视角旋转)
上述过程中按住Ctrl每5°旋转
物体选中时按R旋转物体
上述过程中按住中键按xyz轴旋转
上述过程中按 X,Y,Z按xyz轴旋转(感觉很有用)
上述过程中按住Shift高精度旋转
Shift + 空格 后 S选择物体并缩放(点击面按面缩放,
点击白圈模型等比缩放)
物体选中状态时 按 S 拖动鼠标缩放
上述过程中按住中键按xyz轴缩放
Alt + G,R,S移动、旋转、缩放清零
数字键盘 .选中物体居中(感觉很有用)
Shift + A添加物体(感觉挺常用)
N呼出Context Toggle
Tab进入编辑模式
Shift + Z切换Viewport Shading
Alt + Z开启透视
Ctrl + Alt + Q开启/关闭三视图(感觉挺有用)
M创建集合,类似ps的文件夹,把几个图层
0.放入进去
Ctrl + P设为父子关系(一起移动)。先选择子,
再Shift选择父,然后Ctrl + P,选择Keep Transform
Ctrl + B 出来+后 放开按键,鼠标左键选择范围只渲染当前范围内的图像
上述模式下,Ctrl + Alt + B退出当前模式
Ctrl + A调出Apply菜单,应用变换

使用Tip

  • Context Toggle中,View栏,如果选中Lock To 3D Cursor,则缩放时以Cursor为锚点缩放
  • 在Shading tab下的Display render preview可以查看渲染效果。点击Render Properties,可以选择Render Engine,Cycles更真实。在Cycles模式下渲染的图会有噪点,可以选中Denoise设置降噪
  • 视窗右上角鼠标移过去会变成+,点击拖动新增加一个视窗。作用是例如一个视窗看渲染效果,一个视窗编辑物品位置等

编辑模式

1,2,3切换选择点、边、面
选择边模式下,Alt + 左键点击某个边选择顶面连续的边(循环边)
同上Ctrl + Alt + 左键点击某个边选择所有的立边(并排边)
选择边或点后,Ctrl + B倒角(bevel)(感觉很有用)(倒角后可以设置
一些参数,例如倒角的面数)
O + 滚轮缩放点击O后,缩放滚轮,可以调整区域,在区域内
的点,可以使用G等操作平滑拉抻
Ctrl + 1,2,3,4,5表面细分修改
Shift + D复制
P使选中部分变成单独的对象
A
选中所有点
Alt + A取消选中所有点
Ctrl + I反选(感觉挺有用)
H
隐藏
Alt + H取消隐藏
E挤出
Ctrl + R环切
上述滚动滑轮增加减少环切个数
I内插面
Shift + E调整折痕
Shift + N重新计算法线方向
L选择关联(例如选择了一个面后,按L,可以选择
这个面的关联面)

Vertex Paint

Shift + K将颜色应用于整个Mesh

雕刻模式

点击顶部Sculpting进入雕刻模式

F缩放雕刻范围
选择一种雕刻,按住Ctrl反方向雕刻(个人理解)

UV Editing模式

Ctrl+E调出菜单,例如可以选择Mark Seam
标记缝合边
A全选,U -> Unwrap展开UV
UV编辑器下点击任意一点,再按L选中这片UV上所有

标记缝合边就像把盒子沿着边剪开一样,如何剪才能将4个面展开到平面上。

操作就是选边然后Ctrl + E Mark Seam,A全选,U Unwrap,不断去尝试。

表面细分修改(Subdivision Surface Modifier)和平滑着色(Smooth Shading)

使用表面细分修改,物体面数就发生改变了,变得更多,但是tab进编辑发现还是编辑低模。个人猜想表面细分修改的初衷是显示高模但是保持低模方便编辑。

平滑着色没有改变物体面数。

具体区别有待进一步发掘。

平滑着色可以开启Auto Smooth,并是设置角度,一定角度范围内才平滑。

细分Subdivide

和表面细分类似,但是改变了低模面数。可以设置Number of Cuts,Smoothness。

吸附(snap)

开启吸附后,可以选择吸附在什么上,如果选择面,则移动的点会吸附到其他物体的面上。如果开启Project Individual Elements,则其他牵连移动的点也会吸附在物体的面上。

材质参数

Roughness粗糙度。数值越小,越接近镜面
Subsurface次表面散射。数值越大,越通透的感觉,
类似蜡、皮肤、塑料,越小越不透明,类似水泥、粉笔。
参考https://www.jianshu.com/p/7ec66604c4a2
Transmission透明度,越大越透明

甜甜圈糖皮拖动形成液滴Tips

当创建完糖皮后,使用Subdivision增加一倍面数,不要太高,不容易编辑,也不要太低,没有效果。

拖动液滴时,只保留最底部边,要把其他所有的点都隐藏掉(Ctrl + I反选),不然其他点会拖累。

甜甜圈撒粒子

首先创建一粒糖。

选择糖皮,点击右侧的Particle Properties,点击+,选择hair,在Render里选择Object,然后在下方的Instance Object选择一粒糖。

Render下可以选择Scale。调整Scale Randomness会随机大小,但是对于糖粒不适合,糖粒应该是粗细一致,长度不一的。正确的方法是:

复制几个糖粒,修改其长度、弯曲程度。将这几个糖粒放到一个collection中,上述Render中选择Collection(而非原来的Object),这样在下方就可以选择刚才创建的Collection了。

Collection每项随机权重问题

点选Use Count,可以修改各个Object的比例。

在Hair下面点击Advanced,会多出速度、旋转、物理。调整旋转,Orientation Axis(坐标系轴向)选择Normal(法线)。这样会绕着糖皮表面法线旋转。Randomize:全方位旋转随机化。Randomize Phase:绕法线旋转随机化。

权重绘制(Weight Paint)

选择糖皮,Ctrl + Tab进入权重绘制模式。绘制权重区域。绘制完成后,回到粒子,Vertex Groups -> Density选择Group,这样就按照权重绘制糖粒了。

Object Data Properties可以看到所有的Vertex Group。

遇到的问题:生成的粒子在糖皮的下方。

原因是糖皮使用了Modifier -> Solidify,所以需要把粒子的Emission -> Source -> Use Modifier Stack勾选,就可以了。

另有一说是可以修改Modifier的Solidify的Normals的Flip,虽然也成功,但是感觉不是正解。这个功能好像是改变法线方向。

随机颜色

首先给糖粒赋上材质,然后到shading页面,下方可视化编程区域,新增一个(Shift + A)Input -> Object Info。可以看到有个Random节点,它可以产生0 – 1的随机浮点数。如何利用这一点产生随机的颜色呢?在添加一个Converter -> ColorRamp。在渐变上添加不同颜色,修改Linear为Constant,使之不渐变。这样,所有的糖粒都变成随机颜色了。

关于复制后,edit object,原来的object也跟着改变的问题

是由于快捷键按错了的原因,应该用Shift + D,而非Option + D(关联复制)

查看与设置Origin

开启、关闭查看Origin是在右上Show Overlays,点击其右侧向下剪头,选中Origins。

设置Origin可以在物体点击右键 -> Set Origin设置,其中,Origin to Geometry是设在几何中心(应该是)。

Texture绘制

在Texture Paint中,如果Object显示的是粉色,则说明此Object是没有Texture的。

创建Texture图片后,在Shading页面,选中物体后,在下方面板创建一个Image Texture,并把前面创建的Testure填入。这样就可以在Texture Paint页面绘制Texture了。

为了追求自然, 可以设置Texture Mask。

对于面包上深色的部分, 可以使用笔刷颜色黑色,Blend为Overlay,这样笔刷涂抹的地方就加深颜色了。

程序置换

在Shading页面,选中物体,在下方面板创建Noise Texture。

想要快速查看纹理效果,可勾选插件:Node Wrangler,Ctrl+Shift+左键点击节点 就可在模型上快速看到其效果。

查看效果后发现好像拉抻了,需要添加一个纹理坐标节点:Input > Texture Coordinate。Object连接到Vector。

添加Vector -> Displacement,噪声的Fac连接到Height,Displacement连接到材质输出的Displacement。Ctrl+Shift+左键点击Principled BSDF即可看到结果。

个人感觉这种效果是法线贴图那种,不是真的凹凸。若要实现真的凹凸,需要设置材质中的Setting -> Displacement,选择Displacement and Bump。调整Displacement的Scale,看到最终效果。

置换的基础是根据网格点来完成的,所以网格点数越高效果越好,点数不够粗糙尖锐就增大Subdivision Surface Modifier的参数。

注:白色凸起,黑色凹陷

多个噪点源叠加

复制Noise Texture,调整Scale。现在的目的是混合叠加两个Noise Texture,方法是新增Color -> MixRGB,将两路Noise Texture输出赋到MixRGB两个颜色输入上。调整Fac值为1,混合模式选择Add。再将输出Color输出到Displacement的Height。

利用ColorRamp形成颜色Gate的效果

在大噪点输出和MixRGB之间,新增加ColorRamp,调整黑色颜色位置,使得强度低于一半的噪点都显示黑色,输出连接到MixRGB。

凹凸叠加颜色加深

还是使用MixRGB,color1使用的是Texture的Color,噪点mix的结果,输出到MixRGB的Fac上,Color2设为凸起的颜色,混合模式为Overlay。Fac输入的深色部分,取的是Color1,浅色部分取的是Color2.

杯子建模笔记

Bridge Edge Loops

制作杯子把,最后与杯子相连,快速的方法是将要连接的两个面删掉,然后选中这两个面的四个顶点,点击F3,搜索bridge,点击搜索结果,即生成了桥接。

调整折痕

选中杯身与杯把的接面四个点,Shift + E调整折痕。

折痕属于视觉效果调整,不会增加定点数,而环切线会

重新计算法线方向

制作液体发现显示不正常。点击Overlays,开启Face Orientation,发现所有物体都是蓝色的,唯独液体是红色的。蓝色的表示正面,红色表示背面。

进入编辑模式,全选所有,Shift + N重新计算法线方向(Recaculate Normals)。

杯子与液体间有间隙导致折射看起来不对的问题

解决办法是,穿模。把液体稍微放大,穿过杯子内壁,使之没有缝隙。尚无更好的解决办法。

复制材质

选中被粘贴的Object,然后按Shift,选需要已经有材料可以复制的Object,然后点击Ctrl + L,可以选择Link的选项。

上述过程是link,如果改变了材质,所有link此材质的都会改变。如果想只改变某个Object的材质,应该点击材质名称右边的数字,即可copy。

为一个Object分配不同的材质

新创建材质或link材质然后独立复制出来,编辑模式下选择要使用该材质的面,然后点击Assign,即可应用。

Blender 2.8 油管最火教程播放地址:

https://www.bilibili.com/video/BV1az4y1X7Tr

https://www.bilibili.com/video/BV1sh411o7eE

https://www.bilibili.com/video/BV1M54y1S7CB

https://www.bilibili.com/video/BV1V54y1i7K6

笔记:

https://www.yuque.com/docs/share/f9eac9d3-0610-40e9-817d-cd41c50c6a49?#

https://www.yuque.com/docs/share/8f56a780-0c60-4e19-af82-c67af3db9006?#

https://www.yuque.com/docs/share/72fafb76-ea4e-45e2-8e21-d6378a2be3b6?#

https://www.yuque.com/docs/share/45719055-6dc3-45e9-b1c9-9ff9791754ea?#

最终效果