前言:应个人毕业设计的需求,要做一款音乐播放器,其中一个页面效果就是仿照QQ音乐的播放界面做一个可旋转的圆形专辑图片,效果如下:
通过最终设计与实现,我们的效果如下:
这里要实现旋转的圆形图,我们首先要对图片进行处理,使之变成圆形的图片,然后再做旋转的处理。
首先,我们自定义组件继承自ImageView,然后在ondraw方法里面使用BitmapShader进行圆角的绘制,详解请见:
Android BitmapShader 实战 实现圆形、圆角图片
在实现圆形图片以后,我们需要让图片动起来的话,我们需要对我们的圆形图片加点小动作——在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) {