高仿QQ音乐之旋转专辑图片的实现—仿留声机效果

前言:应个人毕业设计的需求,要做一款音乐播放器,其中一个页面效果就是仿照QQ音乐的播放界面做一个可旋转的圆形专辑图片,效果如下:
QQ音乐效果
通过最终设计与实现,我们的效果如下:
这里写图片描述

这里要实现旋转的圆形图,我们首先要对图片进行处理,使之变成圆形的图片,然后再做旋转的处理。
首先,我们自定义组件继承自ImageView,然后在ondraw方法里面使用BitmapShader进行圆角的绘制,详解请见:

Android BitmapShader 实战 实现圆形、圆角图片

http://blog.csdn.net/lmj623565791/article/details/41967509

在实现圆形图片以后,我们需要让图片动起来的话,我们需要对我们的圆形图片加点小动作——在ondraw方法里面 对我们的Bitmapshader的 Matrix设置旋转即可,代码如下:

    private void updateShaderMatrix() {
        mShaderMatrix.set(null);
        mShaderMatrix.preRotate(currentRoatate, mBitmapWidth / 2,//实现图片的旋转
                mBitmapHeight / 2);
        mBitmapShader.setLocalMatrix(mShaderMatrix);
    }

然后我们其中的currentRoate即当前图形的旋转值,所以我们只需要添加一个set get 方法来操作这个值即可实现我们的旋转。

// 当前偏移角度
    private int currentRoatate = 0;

    public void setRoatate(int roateate) {
        this.currentRoatate = roateate;
        setup();
    }

    public int getRoatate() {
        return currentRoatate;
    }

在完成了设置旋转角度以后,我们只需要让它按时间自动设置这个角度即可,handler+thread或者 asyTask 都可以实现,代码如下:

private class CdTask extends AsyncTask<Void, Integer, Void> {
   

        @Override
        protected Void doInBackground(Void... params) {
            try {
                while (true) {
                    if (isReversal) {
  //是否为反转
                        if (currentRoatate == 0) {
                            currentRoatate = 359;
                        }
                        currentRoatate--;
                    } else {
                        if (currentRoatate == 359) {
                            currentRoatate = 0;
                        }
                        currentRoatate++;
                    }
                    publishProgress(currentRoatate);
                    Thread.sleep(50);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            setRoatate(values[0]);
            super.onProgressUpdate(values);
        }

    }
    private CdTask task = null;
    /**
     * 旋转重置
     */
    public void resetRoatate() {
        if (task != null) {
            task.cancel(true);
            task = null;
        }
        currentRoatate = 0;
        setup();
    }
    /**
     * 旋转暂停
     */
    public void roatatePause() {
        if (task != null) {
            task.cancel(true);
            task = null;
        }
    }
    /**
     * 旋转开始
     */
    public void roatateStart() {
        if (task != null) {
            task.cancel(true);
            task = null;
        }
        task = (CdTask) new CdTask().execute();

    }
    **
     * 是否设置反转
     */
    public void setRoatateReversal(boolean reversal) {
        
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值