欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android自定義View實(shí)現(xiàn)風(fēng)車效果

 更新時(shí)間:2022年08月17日 15:16:43   作者:這個(gè)殺手不太累  
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)風(fēng)車效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Android自定義View實(shí)現(xiàn)風(fēng)車效果的具體代碼,供大家參考,具體內(nèi)容如下

效果圖:

畫桿

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);
? ? }
}

先畫風(fēng)車的桿,再在底部畫一個(gè)橢圓

畫風(fēng)車

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;
? ? ? ? }
? ? }
}

這里使用畫面的旋轉(zhuǎn)方法,繪制扇頁(yè)

旋轉(zhuǎn)

使用屬性動(dòng)畫來(lái)旋轉(zhuǎn)

....
?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>

這里只是介紹了如何繪制類似的效果,很多計(jì)算都是寫死的,如果要實(shí)際使用的話,最好寫成自定義屬性通過(guò)xml屬性聲明傳進(jìn)去。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論