旗帜飞扬核心算法思想:
图片每个交织点的横坐标较之前不发生变化,而纵坐标较之前呈现一个三角函数的周期性变化

public class WaveFlag extends View {private Bitmap bitmap;private final static int HEIGHT = 80;private final static int WIDTH = 60;float[] orig, verts;private final float A = 3.0f;private double k ;public WaveFlag(Context context, @Nullable AttributeSet attrs) {super(context, attrs);init(context);}private void init(Context context) {bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.seekbar_bg_pic);orig = new float[((WIDTH + 2) * 2 * HEIGHT + 1)];verts = new float[(WIDTH + 2) * 2 * HEIGHT + 1];float bitmapWidth = bitmap.getWidth();float bitmapHeight = bitmap.getHeight();int index = 0;for (int y = 0; y <= HEIGHT; y++) {float fy = bitmapHeight * y / HEIGHT;for (int x = 0; x <= WIDTH; x++) {float fx = bitmapWidth * x / WIDTH;orig[index * 2 + 0] = verts[index * 2 + 0] = fx;//这里人为将坐标+100是为了让图像下移,避免扭曲后被屏幕遮挡orig[index * 2 + 1] = verts[index * 2 + 1] = fy + 100;index += 1;}}}public void flagWave() {for (int j = 0; j < HEIGHT; j++) {for (int i = 0; i <= WIDTH; i++) {verts[(j * (WIDTH + 1) + i) * 2 + 0] += 0;float offsetY = (float) Math.sin((float) i / WIDTH * 2 * Math.PI + Math.PI * k);verts[(j*(WIDTH+1)+i)*2+1] = orig[(j*WIDTH+i)*2+1]+offsetY* A;}}}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);flagWave();k+=0.1F;canvas.drawBitmapMesh(bitmap,WIDTH,HEIGHT,verts,0,null,0,null);invalidate();}
}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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=".CH6.section6.WaveFlagActivity"><wangsheng.swpuiot.qunyingzhuan.CH6.section6.WaveFlagandroid:layout_width="match_parent"android:layout_height="match_parent" /></FrameLayout>
public class WaveFlagActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_wave_flag);}
}

Android使用drawBitmapMesh方法实现旗帜飞扬,舞动的图片效果相关推荐

  1. 按钮 toast android,Android Toast使用方法(普通提示和带图片的提示)

    Toast 是一种非常方便的消息提示框,有两个特点: 1.Toast提示信息不会获取焦点. 2.Toast提示信息过一段时会自动消失. 使用方法比较简单,一般通过以下步骤: 1.调用Toast构造器或 ...

  2. Android 仿京东淘宝 商品详情页 商品图片效果

    最近重构商品,产品要求,按照淘宝京东来.... 成品如图这个效果 思路就是监听外边ScrollView的滑动监听,然后给上边图片设置margin,二话不说上代码 简单的界面布局 <?xml ve ...

  3. android phonegap插件开发方法 plugin

    2019独角兽企业重金招聘Python工程师标准>>> android phonegap插件开发方法 plugin 分类: phonegap 2014-03-03 22:41  59 ...

  4. Android getWindow().setFlags方法

    Android getWindow().setFlags方法 //设置窗体全屏 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCR ...

  5. android+发邮件,Android发送邮件的方法实例详解

    Android发送邮件的方法实例详解 时间:2021-05-20 本文实例讲述了Android发送邮件的方法.分享给大家供大家参考,具体如下: 在android手机中实现发送邮件的功能也是不可缺少的. ...

  6. Android截屏方法总结

    最近研究了一些Android的截屏方法,做一个总结. 图片剪裁方法 使用View.getDrawingCache()得到Bitmap.非常简单但是只能截图本应用的图片,并且没办法控制截图的范围. 对B ...

  7. [转]JS调用Android里面的方法,Android调用JS里面的方法

    FROM : http://blog.csdn.net/hj563308597/article/details/45197709 Android WebView 在公司Android的开发过程中遇到一 ...

  8. Android之Inflate()方法用途+setContentView和inflate区别

    引用:http://blog.chinaunix.net/uid-27024249-id-3304935.html Android之Inflate()方法用途 Inflate()作用就是将xml定义的 ...

  9. android 解决getColor()方法过时

    今天,简单讲讲android里如何解决getColor()方法过时的问题. 之前,我写博客讲了程序员需要解决过时的方法的问题,Google会提供过时函数的替代函数,程序员有责任找到替代函数,并且解决过 ...

最新文章

  1. .NET重构—单元测试的代码重构
  2. 使用vb获取网页源文件并保存的简单代码
  3. Redis-cluster架构
  4. 用C语言做一个横板过关类型的控制台游戏
  5. t-mobile频段_T-Mobile再次被黑客入侵:超过200万个帐号和地址可能泄漏
  6. zemax光学设计超级学习手册_穿越十年的一个ZEMAX光学设计案例
  7. 计算机网络应用答题卡,2013-2014学年第2学期11级计算机网络技术毕业考试试卷
  8. 如何用计算机管理员权限,教你电脑使用代码添加管理员权限的详细教程
  9. php sqrt函数,sqrt函数怎么使用
  10. 自定义编程移植的加密芯片
  11. js复制json对象
  12. 华硕主板如何设置开机自启_华硕主板自动开机的设置方法.doc
  13. 信息系统项目管理师论文范例4-进度管理
  14. 高精地图对自动驾驶来说有多重要?
  15. 基于Xposed框架截取安卓手机应用数据信息
  16. jsp四大作用域和九大内置对象
  17. 【C语言】案例四十六 点名册(二)【strcpy()函数】
  18. Linux系统使用rsync命令进行本地备份还原详解
  19. 加密芯片ATSHA204之使用
  20. E:有几个软件包无法下载,要不运行 apt-get update 或者加上 –fix-missing 的选项再试试?

热门文章

  1. Python 08-文件读写
  2. 协同过滤-SSM服装在线购买购物商城(SSM,JSP,Bootstrap,MYSQL)
  3. 微型计算机cpu主要有两部分构成 他们是,【单选题】微型计算机的CPU主要由两部分构成,它们是( ) A. 内存和控制器 B. 内存和外存 C. 运算器和控制器 D. 外存和运算器...
  4. 如何修改ftp服务器密码
  5. Android连上USb不充电,手机连接电脑只显示充电没有usb连接怎么办?
  6. JDK1.8u安装教程
  7. 食物链(经典种类并查集问题)---详解
  8. Arduino学习笔记 类比信号,可变电阻
  9. 计算机序列类型和字典试题,计算机考试试题和资料
  10. 2019届互联网校招薪资报告