最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

效果圖:

畫(huà)桿

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

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

畫(huà)風(fēng)車(chē)

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

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

旋轉(zhuǎn)

使用屬性動(dòng)畫(huà)來(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>

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

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

相關(guān)文章

最新評(píng)論

修武县| 康定县| 平昌县| 利辛县| 安吉县| 南岸区| 正蓝旗| 林州市| 德阳市| 普兰县| 威宁| 温宿县| 门头沟区| 枣强县| 恩平市| 上蔡县| 东宁县| 彰武县| 包头市| 花莲市| 天柱县| 泸溪县| 屯昌县| 缙云县| 泽普县| 沿河| 子长县| 安塞县| 耿马| 阜新| 汤原县| 大冶市| 象州县| 永康市| 古浪县| 腾冲县| 济南市| 保山市| 天水市| 镇江市| 石河子市|