# 锁屏进入相机方式-小贴士
强大的百变锁屏可以帮助我们实现不同的视觉交互效果,同时也可以通过一些接口,打开相应的系统功能。 随着小米的成长,与主题使用者的增加,大家在制作各种百变锁屏的同时,也需要照顾到使用者的习惯哟。大家应该已经注意到了,系统为了避免锁屏误触打开相机等情况,已将默认进入相机的方式改为了按住右下方相机小图标左滑进入。
为避免使用者误操作进入相机,或不了解 个性主题 导致的无法进入相机吐槽。故针对锁屏进入相机的方式进行划分:
# 一、系统样式布局
# 若相机小图标在右下角(与系统默认效果相似),则进入相机方式需与系统保持一致。
1、使用编辑器中锁屏插件。
【锁屏--百变锁屏--锁屏框架--简版锁屏/上滑解锁框架/工具负一屏含框架】
2、手动编写百变锁屏代码逻辑(含优化动画)--见小贴士最后
特别提醒:若未使用建议中两种方式,且相机小图标在右下角,则由官方审核判断是否符合系统默认进入相机效果,反之则有可能被驳回哟。
# 二、非系统样式布局
# 若相机小图标在其他位置(非屏幕右下角)
请大家自行判断进入相机的方式是否存在学习难度,若进入方式合理且不会造成使用者的困扰,可在上传审核时备注,由官方审核人员判断是否予以上线。
一切的一切,都为了提高主题质量并增加主题使用人群。还请大家支持哟。
# 百变锁屏代码逻辑
<?xml version="1.0" encoding="utf-8"?>
<Lockscreen version="1" screenWidth="1080" frameRate="30" displayDesktop="false">
<ExternalCommands>
<!-- 初始化 -->
<Trigger action="init">
<VariableCommand name="unlockButtonSwitch" expression="1" />
<VariableCommand name="DS_cameraHint" type="string" expression="'滑动图标进相机'" />
<VariableCommand name="DS_unlockStr" type="string" expression="'上滑解锁'" />
</Trigger>
<!-- 开屏时初始化 -->
<Trigger action="resume">
<VariableCommand name="DS_moveX" expression="0" />
<VariableCommand name="DS_moveY" expression="0" />
<VariableCommand name="DS_moveA" expression="0" />
<VariableCommand name="DS_moveB" expression="0" />
<AnimationCommand target="DS_moveAn" command="play(0,0)" />
<VariableCommand name="DS_unlockA" expression="0" />
<AnimationCommand target="DS_unlockAn" command="play(0,0)" />
<VariableCommand name="DS_moveX_SW" expression="0" />
<VariableCommand name="DS_moveY_SW" expression="0" />
<VariableCommand name="DS_unlockSW" expression="0" />
</Trigger>
</ExternalCommands>
<!-- 主界面 -->
<Group visibility="#move {= 0">
<!-- 此处放置主界面代码 -->
</Group>
<Group x="#move">
<!-- 负一屏 -->
<Group x="-1080" visibility="gt(#move,0)">
<!-- 此处放置负一屏代码 -->
</Group>
<!-- 底部 -->
<Group visibility="#move != 1080">
<!-- 右相机图标 -->
<Group x="950-#DS_springingAn">
<Image x="15" y="#screen_height-65" alignV="center" src="DS/camera.png" alpha="160" />
<Text name="DS_cameraHintW" x="12" y="#screen_height-65" color="#ffffff" align="right" alignV="center" textExp="@DS_cameraHint" size="36" alpha="#DS_hintAn" />
<Image x="0-#DS_cameraHintW.text_width" y="#screen_height-65" align="right" alignV="center" src="DS/arrow.png" alpha="#DS_hintAn" />
</Group>
<!-- 负一屏图标 -->
<Image x="25" y="#screen_height-65" alignV="center" src="DS/left_icon.png" alpha="160" />
<!-- 解锁提示文本 -->
<Text x="540" y="#DS_unlockMoveY+#screen_height-65" color="#ffffff" align="center" alignV="center" textExp="@DS_unlockStr" size="40" alpha="(160+#DS_unlockMoveY*#DS_moveY_SW/350*255)*(#DS_hintAn == 0)" />
</Group>
</Group>
<!-- 右相机页 -->
<Image x="1080+#move" y="0" w="1080" h="#screen_height" srcExp="'DS/right_screen/cam_bg_'+int(#screen_height == 1920)+'.9.png'" visibility="#move { 0" />
<!-- 滑动 -->
<Var name="move" expression="max(min(#DS_moveX+int(#DS_moveAn),1080),-1080)" />
<Var name="DS_unlockMoveY" expression="#DS_unlockAn+#DS_moveY" />
<Var name="DS_moveAn">
<VariableAnimation initPause="true" loop="false">
<Item value="#DS_moveA" time="0" easeType="QuartEaseOut" />
<Item value="#DS_moveB" time="500" />
<Triggers>
<Trigger action="end">
<VariableCommand name="DS_moveA" expression="#DS_moveB" />
<!-- 、 -->
<!-- 打开相机 -->
<IntentCommand action="android.intent.action.MAIN" package="com.android.camera" class="com.android.camera.Camera" condition="#DS_moveAn == -1080">
<Extra name="ShowCameraWhenLocked" type="boolean" expression="1" />
<Extra name="StartActivityWhenLocked" type="boolean" expression="1" />
</IntentCommand>
</Trigger>
</Triggers>
</VariableAnimation>
</Var>
<!-- 解锁回弹 -->
<Var name="DS_unlockAn">
<VariableAnimation initPause="true" loop="false">
<Item value="#DS_unlockA" time="0" easeType="SineEaseOut" />
<Item value="0" time="200" />
</VariableAnimation>
</Var>
<Var name="DS_hintAn">
<VariableAnimation initPause="true" loop="false">
<Item value="0" time="0" />
<Item value="160" time="300" />
<Item value="160" time="1200" />
</VariableAnimation>
</Var>
<Var name="DS_springingAn">
<VariableAnimation initPause="true" loop="false">
<Item value="0" time="0" easeType="SineEaseOut" />
<Item value="70" time="200" easeType="BounceEaseOut" />
<Item value="0" time="800" />
</VariableAnimation>
</Var>
<FramerateController name="framerateAn" loop="false">
<ControlPoint frameRate="30" time="0" />
<ControlPoint frameRate="50" time="50" />
<ControlPoint frameRate="50" time="1000" />
<ControlPoint frameRate="30" time="1050" />
</FramerateController>
<!-- 此按钮覆盖全屏,用#unlockButtonSwitch的值控制是否有效 -->
<Button x="0" y="0" w="1080" h="#screen_height" visibility="#unlockButtonSwitch">
<Triggers>
<Trigger action="down">
<!-- 按下时执行动态帧率framerateAn -->
<AnimationCommand target="framerateAn" command="play" />
</Trigger>
<!-- move态在滑动时会一直刷新 -->
<Trigger action="move">
<!-- 先判断Y轴方向滑动距离是否超过阀值(你按下前#DS_moveX_SW,#DS_moveX_SW都是0) -->
<VariableCommand name="DS_moveY_SW" expression="1" condition="(#DS_moveX_SW == 0) ** ((#touch_y-#touch_begin_y) { -50) ** (#move == 0)" />
<!-- 如果#DS_moveY_SW 为0,检查X轴方向滑动距离是否超过阀值 -->
<VariableCommand name="DS_moveX_SW" expression="1" condition="(#DS_moveY_SW == 0) ** (abs(#touch_begin_x-#touch_x) } 50)" />
<!-- 如果移动方向最先超过阀值的是Y轴方向,计算上滑位移值#DS_moveY,并限制最小值为-350 -->
<VariableCommand name="DS_moveY" expression="max(-350,min(0,int(#touch_y-#touch_begin_y)))" condition="#DS_moveY_SW" />
<!-- 如果移动方向最先超过阀值的是X轴方向,计算左右位移值#DS_moveX -->
<MultiCommand condition="#DS_moveX_SW">
<!-- 方向往左,并且触摸点在屏幕底部150像素以外,#DS_leftMoveSW才为1,主界面才允许往左移 -->
<VariableCommand name="DS_leftMoveSW" expression="(#touch_begin_y { (#screen_height-150)) ** (int(#DS_moveAn+#touch_x-#touch_begin_x) { 0)" />
<!-- 计算左右滑动距离#DS_moveX -->
<VariableCommand name="DS_moveX" expression="int(#touch_x-#touch_begin_x)" />
<!-- 若#DS_leftMoveSW大于0,修正值#DS_moveX,也就是禁止左滑 -->
<VariableCommand name="DS_moveX" expression="max(#DS_moveX,0)" condition="#DS_leftMoveSW" />
</MultiCommand>
</Trigger>
<Trigger action="up,cancel">
<!-- 若被判定为上滑 -->
<MultiCommand condition="#DS_moveY_SW">
<!-- #DS_moveY为-350时解锁 -->
<ExternCommand command="unlock" condition="#DS_moveY == -350" />
<VariableCommand name="DS_unlockSW" expression="#DS_moveY == -350" />
<!-- #DS_moveY未达到阀值,执行动画,回归初始态 -->
<MultiCommand condition="#DS_moveY } -350">
<VariableCommand name="DS_unlockA" expression="#DS_moveY" />
<VariableCommand name="DS_moveY" expression="0" />
<AnimationCommand target="DS_unlockAn" command="play" />
</MultiCommand>
</MultiCommand>
<!-- 若被判定为左右滑动 -->
<MultiCommand condition="#DS_moveX_SW">
<!-- #DS_direction:左右滑动方向,左为负,右为正 -->
<VariableCommand name="DS_direction" expression="((#touch_x } #touch_begin_x)*2-1)*(abs(#DS_moveX) } 200)*(#move { 1080)*(#move } -1080)" />
<MultiCommand condition="#DS_moveX != 0">
<VariableCommand name="DS_moveA" expression="#move" />
<VariableCommand name="DS_moveB" expression="#DS_moveB+#DS_direction*1080" />
<VariableCommand name="DS_moveX" expression="0" />
<!-- 执行松手时的动画 -->
<AnimationCommand target="DS_moveAn" command="play" />
</MultiCommand>
<!-- 左滑,但并非按住相机图标左滑,执行回弹动画,并且显示提示语-->
<MultiCommand condition="#DS_direction == 0 ** #touch_x { #touch_begin_x">
<AnimationCommand target="DS_hintAn" command="play(1200,0)" />
<AnimationCommand target="DS_springingAn" command="play" />
</MultiCommand>
</MultiCommand>
<!-- #DS_moveX_SW、#DS_moveY_SW归零 -->
<VariableCommand name="DS_moveY_SW" expression="0" condition="!#DS_unlockSW" />
<VariableCommand name="DS_moveX_SW" expression="0" />
</Trigger>
</Triggers>
</Button>
</Lockscreen>