# 锁屏进入相机方式-小贴士

强大的百变锁屏可以帮助我们实现不同的视觉交互效果,同时也可以通过一些接口,打开相应的系统功能。 随着小米的成长,与主题使用者的增加,大家在制作各种百变锁屏的同时,也需要照顾到使用者的习惯哟。大家应该已经注意到了,系统为了避免锁屏误触打开相机等情况,已将默认进入相机的方式改为了按住右下方相机小图标左滑进入。

为避免使用者误操作进入相机,或不了解 个性主题 导致的无法进入相机吐槽。故针对锁屏进入相机的方式进行划分:

# 一、系统样式布局

# 若相机小图标在右下角(与系统默认效果相似),则进入相机方式需与系统保持一致。

1、使用编辑器中锁屏插件。

【锁屏--百变锁屏--锁屏框架--简版锁屏/上滑解锁框架/工具负一屏含框架】

image

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>
最近更新时间: 12/25/2020, 5:17:30 AM