Android自定義View圖片按Path運動和旋轉(zhuǎn)
更新時間:2018年01月24日 09:43:00 作者:匆忙擁擠repeat
這篇文章主要為大家詳細介紹了Android自定義View圖片按Path運動和旋轉(zhuǎn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了Android自定義View圖片按Path運動旋轉(zhuǎn)的具體代碼,供大家參考,具體內(nèi)容如下
View:
/** * author : stone * email : aa86799@163.com * 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 : aa86799@163.com * 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); } }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android中一種巧妙的drawable.xml替代方案分享
這篇文章主要給大家介紹了關(guān)于Android中一種巧妙的drawable.xml替代方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-09-09Android中使用RecylerView實現(xiàn)聊天框效果
這篇文章主要介紹了Android中使用RecylerView實現(xiàn)聊天框效果,本文通過示例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2018-08-08Android App中使用LinearLayout進行居中布局的實例講解
這篇文章主要介紹了Android App中使用LinearLayout進行居中布局的實例講解,文中分別介紹了水平居中和垂直居中的相關(guān)線性布局,需要的朋友可以參考下2016-04-04