안 드 로 이 드 사용자 정의 보기 회전 원형 그림
생각:
1.먼저 원형 그림 과 원형 배경 그림 을 그 려 야 합 니 다(사용자 정의 View 를 통 해).
2.View 기본 절 차 를 사용자 정의 하여 속성 을 초기 화하 고 너비 와 중심 점 을 측정 한 다음 그림 을 그립 니 다.
3.handler 를 통 해 그림 의 각도 회전 을 실현 합 니 다.그리고 천천히 훑 습 니 다.
효과 그림:
1.잔말 이 많 지 않 으 면 바로 코드 를 올 립 니 다.
public class MusicPlayerView extends View {
private static final long ROTATE_DELAY = 5;//
private int mRotateDegrees;//
private Handler mRotate;
private int mWidth;
private int mHeight;
private float mCenterX;
private float mCenterY;
private RectF rectF;
private Bitmap mBitmapCover;
private float mCoverScale;
private BitmapShader mShader;
private Paint paint;
private boolean isRotating;
private final Runnable mRunnableRotate = new Runnable() {
@Override
public void run() {
if (isRotating) {
updateCoverRotate();
mRotate.postDelayed(mRunnableRotate, ROTATE_DELAY);
}
}
};
/**
* ,
*/
private void updateCoverRotate() {
mRotateDegrees += 1;
mRotateDegrees = mRotateDegrees % 360;
postInvalidate();
}
/**
*
* @return
*/
public boolean isRotating() {
return isRotating;
}
/**
*
*/
public void start(){
isRotating=true;
mRotate.removeCallbacksAndMessages(null);
mRotate.postDelayed(mRunnableRotate,ROTATE_DELAY);
postInvalidate();
}
/**
*
*/
public void stop(){
isRotating = false;
postInvalidate();
}
/**
*
*/
public void setCoverDrawable(int coverDrawable) {
Drawable drawable = getContext().getResources().getDrawable(coverDrawable);
mBitmapCover = drawableToBitmap(drawable);
createShader();
postInvalidate();
}
/**
* Picasso
*
* @param imageUrl
*/
public void setCoverURL(String imageUrl) {
Picasso.with(getContext()).load(imageUrl).into(target);
}
public MusicPlayerView(Context context) {
super(context);
init(context, null);
}
public MusicPlayerView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public MusicPlayerView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
/**
* View
*
* @param context
* @param attrs
*/
private void init(Context context, AttributeSet attrs) {
setWillNotDraw(false);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.play_view);
Drawable mDrawableCover = a.getDrawable(R.styleable.play_view_cover);
if (mDrawableCover != null) {
mBitmapCover = drawableToBitmap(mDrawableCover);
}
a.recycle();
mRotateDegrees = 0;
// handler
mRotate = new Handler();
rectF = new RectF();
}
/**
* , ,
*
* @param widthMeasureSpec
* @param heightMeasureSpec
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
mWidth = MeasureSpec.getSize(widthMeasureSpec);
mHeight = MeasureSpec.getSize(heightMeasureSpec);
int minSide = Math.min(mWidth, mHeight); //
mWidth = minSide;
mHeight = minSide;
setMeasuredDimension(mWidth, mHeight); //
//
mCenterX = mWidth / 2f;
mCenterY = mHeight / 2f;
//
rectF.set(20.0f, 20.0f, mWidth - 20.0f, mHeight - 20.0f);
createShader();
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mShader == null) {
return;
}
// xy, ,
float radius = mCenterX <= mCenterY ? mCenterX - 75.0f : mCenterY - 75.0f;
canvas.rotate(mRotateDegrees, mCenterX, mCenterY);
canvas.drawCircle(mCenterX, mCenterY, radius, paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
}
return super.onTouchEvent(event);
}
private Target target = new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
mBitmapCover = bitmap;
createShader();
postInvalidate();
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
};
private int mCoverColor = Color.YELLOW;
private void createShader() {
if (mWidth == 0) {
return;
}
if (mBitmapCover == null) { //
mBitmapCover = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
mBitmapCover.eraseColor(mCoverColor);
}
mCoverScale = ((float) mWidth) / (float) mBitmapCover.getWidth();
// bitmap
mBitmapCover = Bitmap.createScaledBitmap(mBitmapCover,
(int) (mBitmapCover.getWidth() * mCoverScale), (int) (mBitmapCover.getHeight() * mCoverScale), true);
mShader = new BitmapShader(mBitmapCover, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
paint = new Paint();
paint.setAntiAlias(true);
paint.setShader(mShader);
}
/**
* drawable BitmapShader
*
* @param drawable
* @return
*/
private Bitmap drawableToBitmap(Drawable drawable) {
if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
}
int width = drawable.getIntrinsicWidth();
width = width > 0 ? width : 1;
int height = drawable.getIntrinsicHeight();
height = height > 0 ? height : 1;
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
}
2.attrs 속성 하나 까 먹 을 뻔
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="play_view">
<attr name="cover" format="integer"/>
</declare-styleable>
</resources>
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.