zoukankan      html  css  js  c++  java
  • 用RotateDrawable实现网易云音乐唱片机效果

    唱片机

    有一段时间没有更新文章了,记得上一篇文章讲的是《用ClipDrawable实现音频录制麦克风讲话效果》,用户反响也都还不错,自己也是深受鼓励。事实上从那之后就一直想写一篇关于RotateDrawable的文章,原因非常easy。RotateDrawable事实上和上一篇文章中的ClipDrawable非常类似。正愁着不知道以什么样的方式向大家介绍,也正是这个原因吧,一直没有发表新的文章。赶巧了。在用朋友手机的时候发现了一款名叫‘网易云音乐’的APP,在主播放页面有一个唱片机的功能感觉不错诶,于是乎。把玩了一番,心想着。何不用RotateDrawable实现这样一个功能呢? 说干就干!。。

    老规矩。使用之前我们还是先要来了解一下今天的主角RotateDrawable

    RotateDrawable

    事实上从名字中就不难理解。RotateDrawable一定是一个和旋转有关的Drawable。的确,RotateDrawable能够控制drawable的旋转,在XML文件里定义RotateDrawable对象使用的根元素是< rotate… />元素。该元素包括下面几个重要的属性:

    • android:drawable:指定将要进行旋转操作的Drawable对象。
    • android:visible:视图是否可见,注意默认是false。也就是不可见。
    • android:pivotX:pivotX表示旋转轴心在x轴横坐标上的位置,用百分比表示,表示在当前drawable总宽度百分之几的位置。
    • android:pivotY:同理,pivotY表示旋转轴心在y轴横坐标上的位置,用百分比表示。表示在当前drawable总高度百分之几的位置。
    • android:fromDegrees:fromDegrees表示起始角度。值大于0。则表示顺时针旋转,值小于0。则表示逆时针旋转。
    • android:toDegrees:fromDegrees表示终点角度,同理,值大于0,则表示顺时针旋转,值小于0,则表示逆时针旋转。

    之所以说RotateDrawable和ClipDrawable类似。是由于它们两个都能够通过调用方法setLevel(int level)来控制drawable的状态,ClipDrawable能够通过调用方法setLevel(int level)来控制截取区间的大小。相同,RotateDrawable能够通过调用方法setLevel(int level)来控制旋转角度的大小,取值相同是在0~10000之间。能够理解为把起始角度和终点角度之间的角度均等分为10000份。当level等于0的时候处于起始位置,当level等于10000的时候处于终点位置。至于中间部分由level的取值大小来决定。

    了解了RotateDrawable的使用原理,那我们就进入正题,怎样使用RotateDrawable实现唱片机的效果,首先呢。当然是要准备素材!

    素材大家能够到Iconfont下载。有能力的也能够自己PS,事实上我们的今天要用到的几张素材非常easy,会简单的PhotoShop操作基本就都能够做出来:

    唱片机

    操纵杆

    唱片

    注意、注意、一定要注意,重要的事情说三遍:在选择或者制作素材的时候一定要注意一点,由于RotateDrawable是用于drawable的旋转操作,所以关于drawable的中心点位置必须严格要求。否则制作出来的drawable在旋转的时候会十分别扭。

    唱片PS图

    操纵杆PS图

    如上面两张截图显示的一样,我制作素材的图片的大小是240x240,唱片的中心点坐标是120x120,也就是pivotX = 50%、pivotY = 50% 。操纵杆的中心点坐标是192x24。 那么pivotX = 80%、pivotY = 10%

    那好,既然素材已经准备完毕。并且它们的中心点也都确认完毕。紧接着。我们就在XML中定义这两个RotateDrawable:

    唱片rotate_cd.xml:

    <?

    xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:pivotX="50%" android:pivotY="50%" android:visible="true" android:fromDegrees="0" android:toDegrees="360" android:drawable="@mipmap/cd" > </rotate>

    操纵杆rotate_hander.xml:

    <?xml version="1.0" encoding="utf-8"?

    > <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:pivotY="10%" android:pivotX="80%" android:toDegrees="0" android:visible="true" android:fromDegrees="-30" android:drawable="@mipmap/box_handbar" > </rotate>

    最后,仅仅要将这两个drawable引用到两个相互叠加的ImageView上,并结合线程和属性动画适当的调用ImageView.getDrawable().setLevel(int level)方法就能实现完美的效果啦 !!!

    <RelativeLayout    
        android:layout_width="140dp"    
        android:layout_height="140dp"    
        android:background="@mipmap/box_background" >
    
        <ImageView        
            android:src="@drawable/rotate_cd"        
            android:id="@android:id/progress"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@mipmap/box_background" />  
    
        <ImageView        
            android:id="@android:id/background"
            android:layout_width="match_parent"
            android:layout_height="match_parent"        
            android:src="@drawable/rotate_hander" />
    </RelativeLayout>
    

    实现效果图

    附上一张效果图,须要源代码的小伙伴也能够点击这里下载哦!!

    假设文中有表述不当或阐述错误的地方。还望正在看文章的您能够帮忙指出。有疑惑呢,也能够在评论中提问或者私信。期待您的意见和建议。欢迎关注交流。

  • 相关阅读:
    react项目中如何解决同时需要多个请求问题
    jq+ajax+bootstrap改写一个动态分页的表格
    Window7+vs2008+QT环境搭建
    mssql charindex
    解决NTLDR is missing,系统无法启动的方法
    基于三汇语音卡的呼叫中心开发(一)
    Wince 或Windows平台 C#调用Bitmap对象后资源应该如何释放
    Anki:插件开发
    java.lang.ClassNotFoundException: com.opensymphony.xwork2.util.ValueStack
    struts2中action之间的一种跳转
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7357187.html
Copyright © 2011-2022 走看看