Android 사용자 정의 View 그림 은 Path 운동 과 회전 을 누 릅 니 다.
View:
/**
* author : stone
* email : [email protected]
* time : 16/5/29 15 29
*/
public class EarthPathView extends View {
private Path mPath;
private Paint mPaint;
private Bitmap mBitmap;
private PathMeasure mPathMeasure;
private float[] mPoint;
private float[] mTan;
private float mDdegrees;
public EarthPathView(Context context) {
this(context, null);
}
public EarthPathView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public EarthPathView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mPaint = new Paint();
mPaint.setColor(Color.RED);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(10);
InputStream is = getResources().openRawResource(R.drawable.earth);
mBitmap = BitmapFactory.decodeStream(is);
}
public void setPath(Path path) {
mPath = path;
mPathMeasure = new PathMeasure(path, false);
mPoint = new float[2];
mTan = new float[2];
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mPath == null) {
return;
}
canvas.rotate(mDdegrees+=2, getWidth()/2, getHeight()/2);
canvas.drawPath(mPath, mPaint);
float degress = (float) Math.toDegrees(Math.atan2(mTan[1], mTan[0]));
Matrix matrix = new Matrix();
matrix.postRotate(degress, mBitmap.getWidth() / 2, mBitmap.getHeight() / 2);
matrix.postTranslate(mPoint[0] - mBitmap.getWidth() / 2, mPoint[1] - mBitmap.getHeight() / 2);
canvas.drawBitmap(mBitmap, matrix, null);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void startAnim() {
ValueAnimator animator = ValueAnimator.ofFloat(0, mPathMeasure.getLength());
animator.setDuration(2000);
animator.setInterpolator(new LinearInterpolator()); //
animator.setRepeatCount(ValueAnimator.INFINITE);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float distance = (float) animation.getAnimatedValue();
mPathMeasure.getPosTan(distance, mPoint, mTan);
invalidate();
}
});
animator.start();
}
}
Activity
package com.stone.canvaspath;
import android.app.Activity;
import android.graphics.Path;
import android.os.Bundle;
import com.stone.canvaspath.earth.EarthPathView;
/**
* author : stone
* email : [email protected]
* time : 16/5/29 15 27
*/
public class EarthActivity extends Activity {
private EarthPathView mPathView;
private Path mPath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int w = getResources().getDisplayMetrics().widthPixels;
int h = getResources().getDisplayMetrics().heightPixels;
mPathView = new EarthPathView(this);
setContentView(mPathView);
int min = Math.min(w, h);
buildPath(w / 2 + 100, h / 2 + 100, min / 4);
mPathView.setPath(mPath);
mPathView.startAnim();
}
private void buildPath(float x, float y, float radius) {
mPath = new Path();
mPath.addCircle(x, y, radius, Path.Direction.CW);
}
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.