开发者社区> wangccsy> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

第二十二章:动画(八)

简介: 旋转和锚AnchorX和AnchorY属性为“缩放”和“旋转”属性设置缩放或旋转的中心,因此它们也会影响ScaleTo和RotateTo动画。CircleButton程序将一个Button旋转一个圆圈,但不像你之前看到的那样。
+关注继续查看

旋转和锚
AnchorX和AnchorY属性为“缩放”和“旋转”属性设置缩放或旋转的中心,因此它们也会影响ScaleTo和RotateTo动画。
CircleButton程序将一个Button旋转一个圆圈,但不像你之前看到的那样。 该程序围绕屏幕中心旋转按钮,为此它需要AnchorX和AnchorY。
XAML文件将Button放在AbsoluteLayout中:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="CircleButton.CircleButtonPage">
    <ContentPage.Padding>
        <OnPlatform x:TypeArguments="Thickness"
                    iOS="0, 20, 0, 0" />
    </ContentPage.Padding>
 
    <AbsoluteLayout x:Name="absoluteLayout"
                    SizeChanged="OnSizeChanged">
        <Button x:Name="button"
                Text="Tap Me!"
                FontSize="Large"
                SizeChanged="OnSizeChanged"
                Clicked="OnButtonClicked" />
    </AbsoluteLayout>
</ContentPage>

此程序为Button使用AbsoluteLayout的唯一原因是将Button精确放置在屏幕上的特定位置。 XAML文件在AbsoluteLayout和Button上设置相同的SizeChanged处理程序。 该事件处理程序将AbsoluteLayout的中心保存为名为center的Point字段,并保存从该中心到最近边缘的距离作为radius字段:

public partial class CircleButtonPage : ContentPage
{
    Point center;
    double radius;
    public CircleButtonPage()
    {
        InitializeComponent();
    }
    void OnSizeChanged(object sender, EventArgs args)
    {
        center = new Point(absoluteLayout.Width / 2, absoluteLayout.Height / 2);
        radius = Math.Min(absoluteLayout.Width, absoluteLayout.Height) / 2;
        AbsoluteLayout.SetLayoutBounds(button,
            new Rectangle(center.X - button.Width / 2, center.Y - radius,
                          AbsoluteLayout.AutoSize,
                          AbsoluteLayout.AutoSize));
    }
    __
}

OnSizeChanged处理程序通过将Button定位在页面的水平中心来结束,但其顶边的半径距离超出AbsoluteLayout的中心:
2019_03_04_094202
回想一下,AnchorX和AnchorY属性必须设置为相对于Button的宽度和高度的数字。 AnchorX值为0表示Button的左边缘,值为1表示右边缘。 类似地,AnchorY值为0表示Button的顶部,值为1表示底部。
要围绕保存为中心的点旋转此按钮,必须将AnchorX和AnchorY设置为基于中心点的值。 Button的中心位于页面中心的正上方,因此AnchorX的默认值为0.5。 但是,AnchorY需要一个从Button顶部到中心点的值,但是以按钮高度为单位:

public partial class CircleButtonPage : ContentPage
{
    __
    async void OnButtonClicked(object sender, EventArgs args)
    {
        button.Rotation = 0;
        button.AnchorY = radius / button.Height;
        await button.RotateTo(360, 1000);
    }
}

然后按钮围绕页面中心完全旋转360度。 这里正在进行中:
2019_03_04_094344

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
第二十二章:动画(二十一)
使用AnimationExtensions为什么ViewExtensions不包含ColorTo动画? 这种方法没有你最初假设的那么明显有三个可能的原因:首先,VisualElement定义的唯一Color属性是BackgroundColor,但通常不是要设置动画的Color属性。
469 0
第二十二章:动画(十六)
使用Animation类让我们对Animation类进行一些实验。 这涉及实例化Animation类型的对象,然后调用Commit,它实际上开始动画。 Commit方法不返回Task对象; 相反,Animation类完全通过回调提供通知。
623 0
第二十二章:动画(十一)
入口动画实际编程中的一种常见类型的动画是在页面首次可见时发生的。 页面上的各种元素可以在进入最终状态之前进行简要动画处理。 这通常被称为入口动画,可能涉及: 翻译,将元素移动到最终位置。 缩放,将元素放大或缩小到最终尺寸。
762 0
第二十二章:动画(十八)
超越高级动画方法你到目前为止看到的ConcurrentAnimations中的例子仅限于Scale和Rotate属性的动画,因此它们没有显示任何你无法做的事情。ViewExtensions类中的方法。
639 0
第二十二章:动画(十五)
深入动画 在第一次遇到时,完整的Xamarin.Forms动画系统可能会有点混乱。 让我们从可用于定义动画的三个公共类的全局视图开始。整理课程除了Easing类之外,Xamarin.Forms动画系统还包含三个公共类。
745 0
第二十二章:动画(十三)
动画Bounds属性也许ViewExtensions类中最好奇的扩展方法是LayoutTo。参数是一个Rectangle值,第一个问题可能是:此方法的动画属性是什么? VisualElement定义的Rectangle类型的唯一属性是Bounds属性。
599 0
第二十二章:动画(十二)
永远的动画在入口动画的相反极端是永远的动画。 应用程序可以实现“永远”或至少在程序结束之前进行的动画。 这种动画的唯一目的通常是展示动画系统的功能,但最好是以令人愉快或有趣的方式。第一个示例称为FadingTextAnimation,并使用FadeTo淡入和淡出两个Label元素。
575 0
第二十二章:动画(十四)
你自己的等待动画在本章的下一节中,您将看到Xamarin.Forms实现的基础动画基础结构。这些底层方法允许您定义自己的动画函数,这些函数返回Task对象,并且可以与await一起使用。在第20章“异步和文件I / O”中,您了解了如何使用静态Task.Run方法创建执行的辅助线程,以执行像Mandelbrot计算这样的密集后台作业。
597 0
第二十二章:动画(四)
相对动画后续点击问题的一个解决方案是使用RelRotateTo(“relative rotate to”),它获取动画开始的当前Rotation属性,然后将其参数添加到动画结束的该值。 这是一个例子: void OnButtonClicked(object sender, EventArgs args) { button.RelRotateTo(90, 1000); } 每次点击都会启动一个动画,在一秒钟内将按钮旋转90度。
930 0
第二十二章:动画(七)
Task.WhenAll和Task.WhenAny另一个强大的选项可让您以非常结构化的方式组合动画,而无需担心编译器警告。 Task类的静态Task.WhenAll和Task.WhenAny方法旨在同时运行多个异步方法。
877 0
+关注
wangccsy
前一个帐号wangccsy@126.com不知道怎么的就成了企业帐号,改不成个人。所以重新注册了一个个人帐号。老程序员。精通JAVA,C#,数据库,对软件开发过程和流程熟悉。考取系统分析师,项目管理师和系统架构设计师等软件资格考试认证。愿意和大家一起前进。
983
文章
391
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载