91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Android項目中實現一個自旋轉圓環特效

發布時間:2021-03-01 15:28:47 來源:億速云 閱讀:343 作者:戴恩恩 欄目:移動開發

本文章向大家介紹如何在Android項目中實現一個自旋轉圓環特效的基本知識點總結和需要注意事項,具有一定的參考價值,需要的朋友可以參考一下。

Android是什么

Android是一種基于Linux內核的自由及開放源代碼的操作系統,主要使用于移動設備,如智能手機和平板電腦,由美國Google公司和開放手機聯盟領導及開發。

實現思路:

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

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

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

代碼實現:

/**
 * Created by jiangzn on 17/2/3.
 */
public class RoundLightBarView extends ImageView {
  private int mTotalWidth, mTotalHeight;
  private int mCenterX, mCenterY;
  //底色畫筆
  private Paint mCirclePaint;
  //進度條畫筆
  private Paint mProgressPaint;
  //圓點畫筆
  private Paint mbitmapPaint;
  private Matrix mMatrix; // 矩陣,用于對圖片進行一些操作
  private float[] pos;   // 當前點的實際位置
  private float[] tan;   // 當前點的tangent值,用于計算圖片所需旋轉的角度
 
 
  private int mCircleR;
 
 
  private Context mContext;
  //距離外圍的邊距
  private float interval ;
 
  private int startAngle = 1;
 
  //球
  private Bitmap mLititleBitmap; // 圓點圖片
 
  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);
    //初始化畫筆
    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() {
    //畫黑底的深色圓畫筆
    mCirclePaint = new Paint();
    //抗鋸齒
    mCirclePaint.setAntiAlias(true);
    // 防抖動
    mCirclePaint.setDither(true);
    // 開啟圖像過濾,對位圖進行濾波處理。
    mCirclePaint.setFilterBitmap(true);
    mCirclePaint.setColor(Color.BLACK);
    //空心圓
    mCirclePaint.setStyle(Paint.Style.STROKE);
    //圓半徑
    mCircleR = DensityUtils.px2dip(mContext, 20);
    mCirclePaint.setStrokeWidth(mCircleR);
 
    //畫彩色圓弧的畫筆
    mProgressPaint = new Paint();
    //抗鋸齒
    mProgressPaint.setAntiAlias(true);
    // 防抖動
    mProgressPaint.setDither(true);
    // 開啟圖像過濾,對位圖進行濾波處理。
    mProgressPaint.setFilterBitmap(true);
    mProgressPaint.setColor(Color.BLUE);
    //空心圓
    mProgressPaint.setStyle(Paint.Style.STROKE);
    //設置筆刷樣式為原型
    mProgressPaint.setStrokeCap(Paint.Cap.ROUND);
    //設置圓弧粗
    mProgressPaint.setStrokeWidth(mCircleR);
    //將繪制的內容顯示在第一次繪制內容之上
    mProgressPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));
 
 
    //圓點畫筆
    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));
    //畫底色圓
    canvas.drawCircle(mCenterX, mCenterY, mCenterX - mCircleR - interval, mCirclePaint);
    //畫進度條
    int colorSweep[] = {Color.TRANSPARENT, Color.parseColor("#3bbaea"),Color.parseColor("#7ac9d3"),Color.parseColor("#7cc9d0")};
 
    //設置漸變色
    sweepGradient = new SweepGradient(mCenterX, mCenterY, colorSweep, null);
    //按照圓心旋轉
    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();
    //通過Path類畫一個90度(180—270)的內切圓弧路徑
    orbit.addArc(
        new RectF(0 + mCircleR + interval, 0 + mCircleR + interval,
            mTotalWidth - mCircleR - interval, mTotalHeight - mCircleR - interval)
        , 2 + startAngle, 350);
    // 創建 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() );  // 將圖片繪制中心調整到與當前點重合
    canvas.drawBitmap(mLititleBitmap, mMatrix, mbitmapPaint);//繪制球
    mbitmapPaint.setColor(Color.WHITE);
    //繪制實心小圓圈
    canvas.drawCircle(pos[0], pos[1], 5, mbitmapPaint);
 
    //啟動繪制
    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;
 
 
  }
 
}

總結:

總體實現難度并不大,復習了自定義View和canvas的知識點。

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

 // 創建 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() );  // 將圖片繪制中心調整到與當前點重合
    canvas.drawBitmap(mLititleBitmap, mMatrix, mbitmapPaint);//繪制球
    mbitmapPaint.setColor(Color.WHITE);
    //繪制實心小圓圈
    canvas.drawCircle(pos[0], pos[1], 5, mbitmapPaint);

以上就是小編為大家帶來的如何在Android項目中實現一個自旋轉圓環特效的全部內容了,希望大家多多支持億速云!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

晋宁县| 汤阴县| 区。| 个旧市| 逊克县| 宁津县| 无为县| 米脂县| 资溪县| 保靖县| 当涂县| 阜康市| 定结县| 麻城市| 英吉沙县| 济源市| 龙岩市| 顺昌县| 竹山县| 轮台县| 株洲县| 甘孜县| 临潭县| 浦东新区| 宜兰县| 商丘市| 化隆| 乌拉特前旗| 垦利县| 渑池县| 建阳市| 商都县| 娄烦县| 同江市| 滦南县| 谢通门县| 陆良县| 松溪县| 阳高县| 东乡族自治县| 积石山|