全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android Shader应用开发之雷达扫描效果

本文实例为大家分享了Android雷达扫描效果的具体代码,供大家参考,具体内容如下

效果图

知识点提要

  • Shader
  • 矩阵matrix
  • 属性动画

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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Android  # 雷达扫描  # Android应用中使用ContentProvider扫描本地图片并显示  # Android实现扫描和生成二维码  # Android实现扫描二维码功能  # Android studio 实现手机扫描二维码功能  # Android如何实现扫描和生成二维码  # Android银行卡扫描获取银行卡号  # Android实现银行卡号扫描识别功能  # Android 6.0 扫描不到 Ble 设备需开启位置权限的方法  # Android手机(设备)连接扫描枪扫码遇到的问题  # Android编程实现wifi扫描及连接的方法  # Android实现支付宝AR扫描动画效果  # Android 二维码扫描和生成二维码功能  # Android 开机应用扫描相关总结  # 着色器  # 自定义  # 画出  # 的是  # 是一个  # 你在  # 一支  # 要在  # 才可以  # 迫不得已  # 越多  # 你所  # 不支持  # 大家分享  # 写在  # 具体内容  # 整张  # 大家多多  # 而不是  # 不停地 


相关文章: 如何在IIS7中新建站点?详细步骤解析  网站制作软件有哪些,制图软件有哪些?  南京网站制作费用,南京远驱官方网站?  建站之星代理费用多少?最新价格详情介绍  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  香港服务器租用每月最低只需15元?  c++ stringstream用法详解_c++字符串与数字转换利器  建站之星后台管理系统如何操作?  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  定制建站流程步骤详解:一站式方案设计与开发指南  html制作网站的步骤有哪些,iapp如何添加网页?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  香港服务器WordPress建站指南:SEO优化与高效部署策略  定制建站流程解析:需求评估与SEO优化功能开发指南  制作网站的软件免费下载,免费制作app哪个平台好?  如何选择靠谱的建站公司加盟品牌?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  定制建站是什么?如何实现个性化需求?  如何通过cPanel快速搭建网站?  如何在建站主机中优化服务器配置?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  如何选择服务器才能高效搭建专属网站?  如何在景安服务器上快速搭建个人网站?  如何用5美元大硬盘VPS安全高效搭建个人网站?  如何用西部建站助手快速创建专业网站?  C++中引用和指针有什么区别?(代码说明)  制作农业网站的软件,比较好的农业网站推荐一下?  婚礼视频制作网站,学习*后期制作的网站有哪些?  如何通过VPS搭建网站快速盈利?  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  平台云上自主建站:模板化设计与智能工具打造高效网站  如何在局域网内绑定自建网站域名?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  制作证书网站有哪些,全国城建培训中心证书查询官网?  如何打造高效商业网站?建站目的决定转化率  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  简历在线制作网站免费版,如何创建个人简历?  如何在阿里云通过域名搭建网站?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  建站主机是否等同于虚拟主机?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  名字制作网站免费,所有小说网站的名字?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  如何通过山东自助建站平台快速注册域名?  如何规划企业建站流程的关键步骤? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。