激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Android - Android實(shí)現(xiàn)光點(diǎn)模糊漸變的自旋轉(zhuǎn)圓環(huán)特效

Android實(shí)現(xiàn)光點(diǎn)模糊漸變的自旋轉(zhuǎn)圓環(huán)特效

2022-03-07 14:37化作孤島的瓜 Android

這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)光點(diǎn)模糊漸變的自旋轉(zhuǎn)圓環(huán)特效,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Android實(shí)現(xiàn)光點(diǎn)模糊漸變的自旋轉(zhuǎn)圓環(huán)效果,供大家參考,具體內(nèi)容如下

項(xiàng)目中需要實(shí)現(xiàn)的效果圖如下:

Android實(shí)現(xiàn)光點(diǎn)模糊漸變的自旋轉(zhuǎn)圓環(huán)特效

可以這個(gè)表盤(pán)看到中間部分都是沒(méi)有什么難點(diǎn)的,主要是周?chē)鷪A環(huán)的三種效果:

1.漸變色

2.尖端的白點(diǎn)模糊效果

3.路徑繪制

最終實(shí)現(xiàn)的效果圖如下:

Android實(shí)現(xiàn)光點(diǎn)模糊漸變的自旋轉(zhuǎn)圓環(huán)特效

完美實(shí)現(xiàn)了三點(diǎn)要求。

實(shí)現(xiàn)思路:

1.首先是黑色底色圓環(huán)的繪制(黑色圈是固定不變的)。

2.在繪制好黑色底色圓環(huán)之后再繪制漸變色圓弧(藍(lán)綠部分)。

3.最后繪制小星星部分,使用一張模糊圖片得到bitmap,并通過(guò)PathMeasure進(jìn)行路徑繪制。

代碼實(shí)現(xiàn):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
/**
 * Created by jiangzn on 17/2/3.
 */
public class RoundLightBarView extends ImageView {
  private int mTotalWidth, mTotalHeight;
  private int mCenterX, mCenterY;
  //底色畫(huà)筆
  private Paint mCirclePaint;
  //進(jìn)度條畫(huà)筆
  private Paint mProgressPaint;
  //圓點(diǎn)畫(huà)筆
  private Paint mbitmapPaint;
  private Matrix mMatrix; // 矩陣,用于對(duì)圖片進(jìn)行一些操作
  private float[] pos;   // 當(dāng)前點(diǎn)的實(shí)際位置
  private float[] tan;   // 當(dāng)前點(diǎn)的tangent值,用于計(jì)算圖片所需旋轉(zhuǎn)的角度
 
 
  private int mCircleR;
 
 
  private Context mContext;
  //距離外圍的邊距
  private float interval ;
 
  private int startAngle = 1;
 
  //球
  private Bitmap mLititleBitmap; // 圓點(diǎn)圖片
 
  public RoundLightBarView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
 
  }
 
  public RoundLightBarView(Context context, AttributeSet attrs) {
    super(context, attrs);
    mContext = context;
    interval = DensityUtils.px2dip(mContext, 50);
    //初始化畫(huà)筆
    initPaint();
    //初始化bitmap
    initBitmap();
  }
 
  private void initBitmap() {
    mMatrix=new Matrix();
    pos = new float[2];
    tan = new float[2];
    mLititleBitmap= ((BitmapDrawable) getResources()
        .getDrawable(R.mipmap.white_round))
        .getBitmap();
  }
 
  private void initPaint() {
    //畫(huà)黑底的深色圓畫(huà)筆
    mCirclePaint = new Paint();
    //抗鋸齒
    mCirclePaint.setAntiAlias(true);
    // 防抖動(dòng)
    mCirclePaint.setDither(true);
    // 開(kāi)啟圖像過(guò)濾,對(duì)位圖進(jìn)行濾波處理。
    mCirclePaint.setFilterBitmap(true);
    mCirclePaint.setColor(Color.BLACK);
    //空心圓
    mCirclePaint.setStyle(Paint.Style.STROKE);
    //圓半徑
    mCircleR = DensityUtils.px2dip(mContext, 20);
    mCirclePaint.setStrokeWidth(mCircleR);
 
    //畫(huà)彩色圓弧的畫(huà)筆
    mProgressPaint = new Paint();
    //抗鋸齒
    mProgressPaint.setAntiAlias(true);
    // 防抖動(dòng)
    mProgressPaint.setDither(true);
    // 開(kāi)啟圖像過(guò)濾,對(duì)位圖進(jìn)行濾波處理。
    mProgressPaint.setFilterBitmap(true);
    mProgressPaint.setColor(Color.BLUE);
    //空心圓
    mProgressPaint.setStyle(Paint.Style.STROKE);
    //設(shè)置筆刷樣式為原型
    mProgressPaint.setStrokeCap(Paint.Cap.ROUND);
    //設(shè)置圓弧粗
    mProgressPaint.setStrokeWidth(mCircleR);
    //將繪制的內(nèi)容顯示在第一次繪制內(nèi)容之上
    mProgressPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));
 
 
    //圓點(diǎn)畫(huà)筆
    mbitmapPaint = new Paint();
    mbitmapPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));
    mbitmapPaint.setStyle(Paint.Style.FILL);
    mbitmapPaint.setAntiAlias(true);
 
  }
 
  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    //canvas去鋸齒
    canvas.setDrawFilter(
        new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));
    //畫(huà)底色圓
    canvas.drawCircle(mCenterX, mCenterY, mCenterX - mCircleR - interval, mCirclePaint);
    //畫(huà)進(jìn)度條
    int colorSweep[] = {Color.TRANSPARENT, Color.parseColor("#3bbaea"),Color.parseColor("#7ac9d3"),Color.parseColor("#7cc9d0")};
 
    //設(shè)置漸變色
    sweepGradient = new SweepGradient(mCenterX, mCenterY, colorSweep, null);
    //按照?qǐng)A心旋轉(zhuǎn)
    Matrix matrix = new Matrix();
    matrix.setRotate(startAngle, mCenterX, mCenterY);
    sweepGradient.setLocalMatrix(matrix);
 
    mProgressPaint.setShader(sweepGradient);
 
    canvas.drawArc(
        new RectF(0 + mCircleR + interval, 0 + mCircleR + interval,
            mTotalWidth - mCircleR - interval, mTotalHeight - mCircleR - interval),
        2 + startAngle, 350, false, mProgressPaint);
 
    startAngle++;
    if (startAngle == 360) {
      startAngle = 1;
    }
 
    //繪制白色小星星
    Path orbit = new Path();
    //通過(guò)Path類(lèi)畫(huà)一個(gè)90度(180—270)的內(nèi)切圓弧路徑
    orbit.addArc(
        new RectF(0 + mCircleR + interval, 0 + mCircleR + interval,
            mTotalWidth - mCircleR - interval, mTotalHeight - mCircleR - interval)
        , 2 + startAngle, 350);
    // 創(chuàng)建 PathMeasure
    PathMeasure measure = new PathMeasure(orbit, false);
    measure.getPosTan(measure.getLength() * 1, pos, tan);
    mMatrix.reset();
    mMatrix.postScale(2,2);
    mMatrix.postTranslate(pos[0] - mLititleBitmap.getWidth() , pos[1] - mLititleBitmap.getHeight() );  // 將圖片繪制中心調(diào)整到與當(dāng)前點(diǎn)重合
    canvas.drawBitmap(mLititleBitmap, mMatrix, mbitmapPaint);//繪制球
    mbitmapPaint.setColor(Color.WHITE);
    //繪制實(shí)心小圓圈
    canvas.drawCircle(pos[0], pos[1], 5, mbitmapPaint);
 
    //啟動(dòng)繪制
    postInvalidateDelayed(10);
  }
 
  SweepGradient sweepGradient;
 
  @Override
  protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    mTotalWidth = w;
    mTotalHeight = h;
    mCenterX = mTotalWidth / 2;
    mCenterY = mTotalHeight / 2;
 
 
  }
 
}

總結(jié):

總體實(shí)現(xiàn)難度并不大,復(fù)習(xí)了自定義View和canvas的知識(shí)點(diǎn)。

其中需要重視的點(diǎn)在繪圖層需要注意給畫(huà)筆添加覆蓋模式:setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP)),將繪制的內(nèi)容顯示在第一次繪制的內(nèi)容之上,還有一個(gè)比較難的點(diǎn)是PathMeasure進(jìn)行對(duì)bitmap的路徑收集和方向控制并繪制小星星的過(guò)程:

?
1
2
3
4
5
6
7
8
9
10
// 創(chuàng)建 PathMeasure
   PathMeasure measure = new PathMeasure(orbit, false);
   measure.getPosTan(measure.getLength() * 1, pos, tan);
   mMatrix.reset();
   mMatrix.postScale(2,2);
   mMatrix.postTranslate(pos[0] - mLititleBitmap.getWidth() , pos[1] - mLititleBitmap.getHeight() );  // 將圖片繪制中心調(diào)整到與當(dāng)前點(diǎn)重合
   canvas.drawBitmap(mLititleBitmap, mMatrix, mbitmapPaint);//繪制球
   mbitmapPaint.setColor(Color.WHITE);
   //繪制實(shí)心小圓圈
   canvas.drawCircle(pos[0], pos[1], 5, mbitmapPaint);

源碼下載:Android實(shí)現(xiàn)光點(diǎn)模糊漸變的自旋轉(zhuǎn)圓環(huán)特效

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

原文鏈接:https://blog.csdn.net/qq_22770457/article/details/54882052

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 午夜精品福利视频 | 精品国产91久久久久久久妲己 | 污黄视频在线观看 | 男女羞羞视频在线免费观看 | 欧美一级高清免费 | 国产色91| www.国产一区.com | 亚洲免费视 | 日本欧美中文字幕 | 操你啦免费视频 | 思思久而久而蕉人 | 狠狠操视频网站 | 欧美精品成人一区二区在线观看 | 久色porn | 91精品国产乱码久久久久久久久 | 成人一级黄色大片 | 免费a级片在线观看 | 91精品国产日韩91久久久久久360 | 草妞视频 | 天天夜夜操操 | 天天色图片 | 成人资源在线观看 | 精品在线观看一区二区 | aa国产视频一区二区 | 久久生活片 | 老师你怎么会在这第2季出现 | 久久久久女人精品毛片 | 国产一区二区亚洲 | 国产成人精品一区二区仙踪林 | 久久精精品 | 特级a欧美做爰片毛片 | 久久亚色 | 精品一区二区在线观看 | 女人解衣喂奶电影 | 欧美黄色一级生活片 | 蜜桃视频在线免费观看 | 视频一区二区三区在线播放 | 日本不卡二区 | 久久91久久久久麻豆精品 | 中文字幕在线播放不卡 | 欧美精品免费一区二区三区 |