ホームページ  >  記事  >  Java  >  Android アニメーション レーダー スキャン効果

Android アニメーション レーダー スキャン効果

高洛峰
高洛峰オリジナル
2017-01-16 17:18:172300ブラウズ

まずは全体の印象を掴むためにレンダリングを見てみましょう

Android アニメーション レーダー スキャン効果

それでは、理解を容易にするために、ここではアニメーションで見た内容に合わせて順番に展開していきます

準備

ここでCanvas (キャンバス) と Paint (ブラシ) を使用して、この単純なアニメーション コントロールを実装することにしました。

図から、2 本の交差した線、いくつかの円、およびいくつかの白い点があることがわかります。そこで、最初に必要なブラシ、キャンバス、およびいくつかのデータを定義します

setBackgroundColor(Color.TRANSPARENT);
 
 //宽度=5,抗锯齿,描边效果的白色画笔
 mPaintLine = new Paint();
 mPaintLine.setStrokeWidth(5);
 mPaintLine.setAntiAlias(true);
 mPaintLine.setStyle(Style.STROKE);
 mPaintLine.setColor(Color.WHITE);
 
 //宽度=5,抗锯齿,描边效果的浅绿色画笔
 mPaintCircle = new Paint();
 mPaintCircle.setStrokeWidth(5);
 mPaintCircle.setAntiAlias(true);
 mPaintCircle.setStyle(Style.FILL);
 mPaintCircle.setColor(0x99000000);
 
 //暗绿色的画笔
 mPaintSector = new Paint();
 mPaintSector.setColor(0x9D00ff00);
 mPaintSector.setAntiAlias(true);
 //定义一个暗绿色的梯度渲染
 mShader = new SweepGradient(viewSize / 2, viewSize / 2,
Color.TRANSPARENT, Color.GREEN);
 mPaintSector.setShader(mShader);
 
 //白色实心画笔
 mPaintPoint=new Paint();
 mPaintPoint.setColor(Color.WHITE);
 mPaintPoint.setStyle(Style.FILL);
 
 //随机生成一些数组点,模拟雷达扫描结果
 point_x = UtilTools.Getrandomarray(15, 300);
 point_y = UtilTools.Getrandomarray(15, 300);

これが SweatGradient のコンストラクターです

ここで、cx,cy は円の中心を指定し、color1,color0 または Colors はグラデーションの色を指定します。position が NULL に設定されている場合は、各色の相対位置を指定することもできます。それは色が均一に分布していることを意味します。


基本的なグラフィックを描画する

public SweepGradient(float cx, float cy, int[] colors, float[] positions)

この方法で、UI 全体を描画し、アニメーションを追加して全体的な効果を実現できます。

アニメーションの実装


ここでアニメーションを実装する際には行列であるMatrixを使用します。学生時代、線形代数学の先生がいろいろな線形変換について話していたとき、これは何のためにあるのか考えていたのですが、今になってやっと出会ったのですが、混乱しているようです。一般に、Matrix を使用すると、変位、回転、スケーリング、透明度の変更などの強力なグラフィック アニメーションを実現できます。Matrix には一連の setTranslate、setRotate、setScale などのメソッドがあります。グラフィックスのさまざまな変換を実現するのに非常に便利です。主なことは、さまざまな変換を理解することです。

アニメーション実装スレッド

public SweepGradient(float cx, float cy, int color0, int color1)

まず、startは回転角度として独立したスレッドに継続的に蓄積されます。次に、それをマトリックスに関連付けます。ここでは3つのマトリックスの方法を試してみましたが、今のところ違いは見つかりませんでした。

アニメーション描画


次に、onDrawメソッドでグラフィックを描画し続けるだけです

canvas.drawCircle(viewSize / 2, viewSize / 2, 350, mPaintCircle);
canvas.drawCircle(viewSize / 2, viewSize / 2, 255, mPaintLine);
canvas.drawCircle(viewSize / 2, viewSize / 2, 125, mPaintLine);
canvas.drawCircle(viewSize / 2, viewSize / 2, 350, mPaintLine);
//绘制两条十字线
canvas.drawLine(viewSize / 2, 0, viewSize / 2, viewSize, mPaintLine);
canvas.drawLine(0, viewSize / 2, viewSize, viewSize / 2, mPaintLine);

ついに実装されました


さて、最終的な全体のコードは以下の通りです:

protected class ScanThread extends Thread {
 
  private RadarView view;
 
  public ScanThread(RadarView view) {
   // TODO Auto-generated constructor stub
   this.view = view;
  }
 
  @Override
  public void run() {
   // TODO Auto-generated method stub
   while (threadRunning) {
    if (isstart) {
     view.post(new Runnable() {
      public void run() {
       start = start + 1;
       matrix = new Matrix();
       //设定旋转角度,制定进行转转操作的圆心
//       matrix.postRotate(start, viewSize / 2, viewSize / 2);
//       matrix.setRotate(start,viewSize/2,viewSize/2);
       matrix.preRotate(direction*start,viewSize/2,viewSize/2);
       view.invalidate();
 
      }
     });
     try {
      Thread.sleep(5);
     } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
   }
  }
 }

説明


冗長な部分は説明しませんコードには明確にコメントが付けられています。この RadarView の使い方も非常に簡単で、停止する必要がある場合は stop メソッドを呼び出すだけです。

//根据matrix中设定角度,不断绘制shader,呈现出一种扇形扫描效果
canvas.concat(matrix);
canvas.drawCircle(viewSize / 2, viewSize / 2, 350, mPaintSector);

ここではレーダーの ViewSize が 800 に設定されているため、通常の使用では、ビューサイズのサイズといくつかの円の半径を実際のニーズに応じて調整する必要があります。効果を表示します。

概要

以上が Android におけるレーダー スキャン エフェクトの内容です。この記事が Android 開発の皆様のお役に立てれば幸いです。

Android アニメーションのレーダー スキャン効果に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。