Android 自定义上拉抽屉+组合动画效果
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 自定义上拉抽屉+组合动画效果相关的知识,希望对你有一定的参考价值。
参考技术A 话不多说先来个效果图看一下实现的主要功能就是上拉抽屉(解决了子view的滑动冲突)+ 边缘动画 + 中间小球和seekbar效果动画。黄色部分就是上拉抽屉整体,绿色部分是横向的recyclerview。有个朋友说有阻尼效果就完美了 ... 因为效果图没有阻尼效果,所以就没有去研究 - -!
顶部也可以放个图片,像酱紫
圆形中间也可以放图片和文字,上下滑动的时候内部图片和文字也会随之改变,其实原理都是一样的,一个会了你放啥都行,文章后面也会介绍。
效果就是酱紫
抽屉里我放的是LinearLayout,然后动态添加了多个可以横向滚动的RecyclerView,上滑下滑左滑右滑轻松无压力~~就是这么刺激
效果介绍完了,下面我们看一下如何实现的
在当前demo里
到这里就可以实现如效果图一样的滚动效果了
这样看就比较直观些
这个就是用贝塞尔曲线画的简单的一个效果
我这里是用了两个三阶贝塞尔曲线,从中间分开,左边一个右边一个,然后吧这个视图上下分为一半,中间的点不变,两边的高度增加,两边是扇形画的圆角,然后lineto画成封闭图形,这样就出现了如上图所示的动画效果。
这部分大家应该就比较熟悉,自定义view经常会用到,用法就不多说了,记录一下中间图片随之缩放和透明改变的写法
然后再动画中不断改变圆和圆环的半径、图的尺寸、画笔透明度,就能达到效果
抽屉的弧度、圆、圆环和图片这些的改变主要是监听当前上滑的距离和需要上滑的距离做的百分比计算的然后相应的随之改变。
是在父view的滚动监听里做的改变,topHeight就是抽屉需要滚动的距离。
之前接触的动画都是单独的模块,直接开始结束的那种,像这次这样需要动态改变而且多个结合的还是第一次遇到(渣渣本渣没错了),所以也是在边学边写,可能有很多地方写的不是很恰当,也是希望大佬可以指出,共同学习共同进步。其实现在的效果是大改过一次的,最初贝塞尔曲线高度取的整个高度,然后改变中间的那个点向下凹,但是外面的圆又要正好一半在他的上方一半在下方,这样的位置其实是不好做适配的,所以就改成了现在的这样。通过这个动画的实现,自己不仅是在自定义view、动画还是一些思考方式上都有所进步,这是挺重要的。项目中还有另一个动画,就下篇再讲吧~
gitee项目地址
https://gitee.com/yoyo666/TopScrollView.git
如何在Xamarin的形式创建自定义抽屉?
答案
我创建了类似的措施。这个工作在两个Android和iOS。
步骤1:添加其具有水族颜色,因为它的背景颜色和在其内的标签2的堆叠布局。
<StackLayout x:Name="stackLayout" Margin="0,0,0,0" WidthRequest="0" HeightRequest="0" Orientation="Vertical" BackgroundColor="Aqua">
<Label Text="Welcome"
HorizontalOptions="Center"
VerticalOptions="CenterAndExpand" />
<Label Text=" Xamarin.Forms!"
HorizontalOptions="Center"
VerticalOptions="CenterAndExpand" />
</StackLayout>
步骤2:在精选按钮的点击我这个动画栈布局的高度。当堆栈布局的高度为0,我是动画〜200栈布局的高度是200,我有动画显示为0。
private void OnNextButtonClicked(object sender, EventArgs e)
if (stackLayout.Height == 0)
Action<double> callback = input => stackLayout.HeightRequest = input;
double startingHeight = 0;
double endingHeight = 200;
uint rate = 16;
uint length = 3000;
Easing easing = Easing.CubicOut;
stackLayout.Animate("invis", callback, startingHeight, endingHeight, rate, length, easing);
else
Action<double> callback = input => stackLayout.HeightRequest = input;
double startingHeight = 200;
double endingHeight = 0;
uint rate = 16;
uint length = 3000;
Easing easing = Easing.CubicIn;
stackLayout.Animate("inviss", callback, startingHeight, endingHeight, rate, length, easing);
你可以看到完整的文件here
另一答案
我们在使用Rg.Plugins.Popup的解决了这个。使用这个插件,你可以创建一个单独的页面代表了抽屉。这使得它易于重用它在你的应用程序。
下面是一个示例,它可以让抽屉从右边飞英寸需要注意的是,半透明的背景和填充,使下部页若隐若现。
<?xml version="1.0" encoding="UTF-8" ?>
<pages:PopupPage
x:Class="MyNameSpace.ContextMenuPopup"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:animations="clr-namespace:Rg.Plugins.Popup.Animations;assembly=Rg.Plugins.Popup"
xmlns:pages="clr-namespace:Rg.Plugins.Popup.Pages;assembly=Rg.Plugins.Popup"
BackgroundColor="StaticResource Colors.TransparentMediumGray"
Padding="113,0,0,0"
HasSystemPadding="False">
<pages:PopupPage.Animation>
<animations:MoveAnimation
DurationIn="200"
DurationOut="100"
EasingIn="SinOut"
EasingOut="SinIn"
HasBackgroundAnimation="True"
PositionIn="Right"
PositionOut="Right" />
</pages:PopupPage.Animation>
<ContentPage.Content>
...
</ContentPage.Content>
</pages:PopupPage>
在行动抽屉下面的截图。注意很酷的功能:抽屉在系统区域中可见为好。
以上是关于Android 自定义上拉抽屉+组合动画效果的主要内容,如果未能解决你的问题,请参考以下文章