Android Shader 응용 개발 레이더 스캐닝 효과

본 논문 의 사례 는 안 드 로 이 드 레이더 스 캔 효과 의 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
효과 도

지식 요점
  • Shader
  • 매트릭스 매트릭스
    속성 애니메이션
    ShaderView3
    
    package com.example.apple.shaderdemo;
    
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.BitmapShader;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Matrix;
    import android.graphics.Paint;
    import android.graphics.Shader;
    import android.graphics.SweepGradient;
    import android.support.annotation.Nullable;
    import android.util.AttributeSet;
    import android.view.View;
    
    /**
     * Created by apple on 2017/5/23.
     *       
     */
    
    public class ShaderView3 extends View {
    
      /**
       *        
       */
      private Paint mSweepPaint;
      /**
       *     bitmap  
       */
      private Paint mBitmapPaint;
      /**
       *      View   ,    xml         (     )
       */
      private int mWidth;
      /**
       *     
       */
      private Bitmap mBitmap;
      /**
       *         
       */
      private int degrees = 0;
      /**
       *           
       */
      Matrix mSweepMatrix = new Matrix();
      /**
       *       Bitmap   
       */
      Matrix mBitmapMatrix = new Matrix();
      /**
       *    ---     
       */
      private SweepGradient mSweepGradient;
      /**
       *      
       */
      private BitmapShader mBitmapShader;
      private float mScale;
    
      public ShaderView3(Context context) {
        super(context);
        init();
      }
    
      public ShaderView3(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
      }
    
      /**
       *     ,   setXxx  ,             
       *
       * @param degrees
       */
      public void setDegrees(int degrees) {
        this.degrees = degrees;
        postInvalidate();//       OnDraw
      }
    
      private void init() {
    //    1.     
        mSweepPaint = new Paint();
        mBitmapPaint = new Paint();
    //    2.     
        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ccc);
        mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
    //    3.           
        mBitmapPaint.setShader(mBitmapShader);
      }
    
      @Override
      protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    //           view   ,   onMeasure   ,          0
        mWidth = getMeasuredWidth();
    //           view    bitmap           ,    ,          ,        
        mScale = (float) mWidth / (float) mBitmap.getWidth();
    //    4.       
        mSweepGradient = new SweepGradient(mWidth / 2, mWidth / 2, new int[]{Color.argb(200, 200, 0, 0), Color.argb(10, 30, 0, 0)}, null);
    //    5.                 
        mSweepPaint.setShader(mSweepGradient);
    
    
      }
    
      @Override
      protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    //           ,  onDraw     ,             ,
    //        onDraw  ,  onDraw        ,      ,     
    
    
    //                 View   
        mBitmapMatrix.setScale(mScale, mScale);
        mBitmapShader.setLocalMatrix(mBitmapMatrix);
    
    //            
        mSweepMatrix.setRotate(degrees, mWidth / 2, mWidth / 2);
        mSweepGradient.setLocalMatrix(mSweepMatrix);
    
    //    5.              ,  ,          ,          
        canvas.drawCircle(mWidth / 2, mWidth / 2, mWidth / 2, mBitmapPaint);
        canvas.drawCircle(mWidth / 2, mWidth / 2, mWidth / 2, mSweepPaint);
    
    
      }
    }
    
    
    외부 호출
    
    package com.example.apple.shaderdemo;
    
    import android.animation.ObjectAnimator;
    import android.animation.ValueAnimator;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.view.animation.LinearInterpolator;
    
    public class MainActivity extends AppCompatActivity {
    
      private ShaderView3 mShaderView;
      int degrees = 0;
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mShaderView = (ShaderView3) findViewById(R.id.sv);
    
        mShaderView.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            ObjectAnimator degrees = ObjectAnimator.ofInt(mShaderView, "degrees", 0, 360);
            degrees.setInterpolator(new LinearInterpolator());
            degrees.setDuration(10000);
            degrees.setRepeatCount(ValueAnimator.INFINITE);
            degrees.start();
            /* new Thread(new Runnable() {
              @Override
              public void run() {
                while (degrees <= 360) {
                  degrees += 1;
                  mShaderView.setDegrees(degrees);
    
                  try {
                    Thread.sleep(30);
                  } catch (InterruptedException e) {
                    e.printStackTrace();
                  }
                }
    
    
              }
            }).start();
    
            degrees = 0;
            mShaderView.setDegrees(degrees);*/
    
    
          }
        });
      }
    }
    
    
    XML 레이아웃
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      tools:context="com.example.apple.shaderdemo.MainActivity">
    
      <com.example.apple.shaderdemo.ShaderView3
        android:id="@+id/sv"
        android:layout_width="300dp"
        android:layout_height="300dp"
        />
    
    </LinearLayout>
    
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기