Android自定義View實現風車效果
更新時間:2022年08月17日 15:16:43 作者:這個殺手不太累
這篇文章主要為大家詳細介紹了Android自定義View實現風車效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了Android自定義View實現風車效果的具體代碼,供大家參考,具體內容如下
效果圖:

畫桿
public class WindmillRodView extends View {
? ? private int mWidth;
? ? private int mHeight;
? ? private Paint mPaint;
? ? public WindmillRodView(Context context) {
? ? ? ? this(context, null);
? ? }
? ? public WindmillRodView(Context context, AttributeSet attrs) {
? ? ? ? this(context, attrs, 0);
? ? }
? ? public WindmillRodView(Context context, AttributeSet attrs, int defStyleAttr) {
? ? ? ? super(context, attrs, defStyleAttr);
? ? ? ? init();
? ? }
? ? private void init() {
? ? ? ? mPaint = new Paint();
? ? ? ? mPaint.setColor(Color.WHITE);
? ? ? ? mPaint.setStyle(Paint.Style.FILL);
? ? ? ? mPaint.setAntiAlias(true);
? ? ? ? mPaint.setDither(true);
? ? }
? ? @Override
? ? protected void onSizeChanged(int w, int h, int oldw, int oldh) {
? ? ? ? super.onSizeChanged(w, h, oldw, oldh);
? ? ? ? mWidth = getMeasuredWidth();
? ? ? ? mHeight = getMeasuredHeight();
? ? }
? ? private int _rod_width = dp2px(2);
? ? @Override
? ? protected void onDraw(Canvas canvas) {
? ? ? ? int xCenter = mWidth / 2;
? ? ? ? int yCenter = mHeight / 3;
? ? ? ? int radius = mHeight / 3 * 2;
? ? ? ? drawRod(canvas, xCenter, yCenter, radius);
? ? }
? ? private void drawRod(Canvas canvas, int xCenter, int yCenter, int radius) {
? ? ? ? Path path = new Path();
? ? ? ? path.moveTo(xCenter - _rod_width, yCenter);
? ? ? ? path.lineTo(xCenter - 2 * _rod_width, radius - dp2px(5));
? ? ? ? path.lineTo((xCenter + 2 * _rod_width), radius - dp2px(5));
? ? ? ? path.lineTo(xCenter + _rod_width, yCenter);
? ? ? ? path.close();
? ? ? ? canvas.drawPath(path, mPaint);
? ? ? ? RectF rectF = new RectF(xCenter - 2 * _rod_width,
? ? ? ? ? ? ? ? radius - dp2px(8),
? ? ? ? ? ? ? ? xCenter + 2 * _rod_width,
? ? ? ? ? ? ? ? radius - dp2px(3));
? ? ? ? canvas.drawOval(rectF, mPaint);
? ? }
? ? private int dp2px(int dp) {
? ? ? ? return (int) (Resources.getSystem().getDisplayMetrics().density * dp + 0.5);
? ? }
}先畫風車的桿,再在底部畫一個橢圓
畫風車
public class WindmillView extends View {
? ? private int mWidth;
? ? private int mHeight;
? ? private Paint mPaint;
? ? private ObjectAnimator mRotationAnim;
? ? public WindmillView(Context context) {
? ? ? ? this(context, null);
? ? }
? ? public WindmillView(Context context, AttributeSet attrs) {
? ? ? ? this(context, attrs, 0);
? ? }
? ? public WindmillView(Context context, AttributeSet attrs, int defStyleAttr) {
? ? ? ? super(context, attrs, defStyleAttr);
? ? ? ? init();
? ? }
? ? private void init() {
? ? ? ? mPaint = new Paint();
? ? ? ? mPaint.setColor(Color.WHITE);
? ? ? ? mPaint.setStyle(Paint.Style.FILL);
? ? ? ? mPaint.setAntiAlias(true);
? ? ? ? mPaint.setDither(true);
? ? }
? ? @Override
? ? protected void onSizeChanged(int w, int h, int oldw, int oldh) {
? ? ? ? super.onSizeChanged(w, h, oldw, oldh);
? ? ? ? mWidth = getMeasuredWidth();
? ? ? ? mHeight = getMeasuredHeight();
? ? }
? ? @Override
? ? protected void onDraw(Canvas canvas) {
? ? ? ? int xCenter = mWidth / 2;
? ? ? ? int yCenter = mHeight / 3;
? ? ? ? int radius = mHeight / 3 * 2;
? ? ? ? canvas.drawCircle(xCenter, yCenter - dp2px(7), dp2px(4), mPaint);
? ? ? ? setPivotX(xCenter);
? ? ? ? setPivotY(yCenter - dp2px(7));
? ? ? ? canvas.save();
? ? ? ? for (int i = 0; i < 3; i++) {
? ? ? ? ? ? Path path = new Path();
? ? ? ? ? ? path.moveTo(xCenter, 0);
? ? ? ? ? ? path.lineTo(xCenter, yCenter - dp2px(11));
? ? ? ? ? ? path.lineTo(xCenter + dp2px(8), yCenter - dp2px(26));
? ? ? ? ? ? path.close();
// ? ? ? ?mPaint.setStrokeJoin(Paint.Join.ROUND);
? ? ? ? ? ? CornerPathEffect cornerPathEffect = new CornerPathEffect(30);
? ? ? ? ? ? mPaint.setPathEffect(cornerPathEffect);
? ? ? ? ? ? canvas.drawPath(path, mPaint);
? ? ? ? ? ? canvas.rotate(360 / 3, xCenter, yCenter - dp2px(7));
? ? ? ? }
? ? ? ? canvas.restore();
? ? ? ? startAnim();
? ? }
? ? private int dp2px(int dp) {
? ? ? ? return (int) (Resources.getSystem().getDisplayMetrics().density * dp + 0.5);
? ? }
? ? public void startAnim() {
? ? ? ? if (mRotationAnim != null && mRotationAnim.isRunning()) return;
? ? ? ? mRotationAnim = ObjectAnimator.ofFloat(this, "Rotation", 360f)
? ? ? ? ? ? ? ? .setDuration(3000);
? ? ? ? mRotationAnim.setRepeatCount(-1);
? ? ? ? mRotationAnim.setInterpolator(new LinearInterpolator());
? ? ? ? mRotationAnim.start();
? ? }
? ? public void stopAnim() {
? ? ? ? if (mRotationAnim != null && mRotationAnim.isRunning()) {
? ? ? ? ? ? mRotationAnim.cancel();
? ? ? ? ? ? mRotationAnim = null;
? ? ? ? }
? ? }
}這里使用畫面的旋轉方法,繪制扇頁
旋轉
使用屬性動畫來旋轉
....
?public void startAnim() {
? ? ? ? if (mRotationAnim != null && mRotationAnim.isRunning()) return;
? ? ? ? mRotationAnim = ObjectAnimator.ofFloat(this, "Rotation", 360f)
? ? ? ? ? ? ? ? .setDuration(3000);
? ? ? ? mRotationAnim.setRepeatCount(-1);
? ? ? ? mRotationAnim.setInterpolator(new LinearInterpolator());
? ? ? ? mRotationAnim.start();
? ? }
? ? public void stopAnim() {
? ? ? ? if (mRotationAnim != null && mRotationAnim.isRunning()) {
? ? ? ? ? ? mRotationAnim.cancel();
? ? ? ? ? ? mRotationAnim = null;
? ? ? ? }
? ? }
?....在布局文件中使用
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" ? ? android:layout_width="match_parent" ? ? android:layout_height="match_parent" ? ? android:background="#000000"> ? ? <com.example.windmill.WindmillRodView ? ? ? ? android:layout_width="200dp" ? ? ? ? android:layout_height="200dp" ? ? ? ? android:layout_centerInParent="true" /> ? ? <com.example.windmill.WindmillView ? ? ? ? android:layout_width="200dp" ? ? ? ? android:layout_height="200dp" ? ? ? ? android:layout_centerInParent="true" /> </RelativeLayout>
這里只是介紹了如何繪制類似的效果,很多計算都是寫死的,如果要實際使用的話,最好寫成自定義屬性通過xml屬性聲明傳進去。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
相關文章
Android?自定義View?加?lifecycle?簡單使用詳解
本文介紹了自定義View的基本使用方法,包括onMeasure、onDraw、自定義樣式和lifecycle的使用,通過了解MeasureSpec的作用和lifecycle的控制,可以更好地管理View的生命周期,避免內存泄露問題,感興趣的朋友一起看看吧2025-03-03
Android RecycleView 實現左滑上下分層示例代碼(自定義功能)
這篇文章主要介紹了Android RecycleView 實現左滑上下分層示例代碼(自定義功能),具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-03-03
使用OkHttp包在Android中進行HTTP頭處理的教程
HTTP頭部處理是HTTP網絡編程中的基本操作,安卓中使用OkHttp包(github.com/square/okhttp)進行相關操作當然也是得心應手,這里我們就來看一下使用OkHttp包在Android中進行HTTP頭處理的教程2016-07-07

