该控件通过sin函数图像变化实现动态,背景颜色和眼皮颜色一致,效果如下

//具体代码

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.View;/*** 自定义的View类,为两个球的碰撞模拟*/
class EyesJFrame extends View {// 设置角度值,同时也就眼睛的横坐标长度int angle = 250;// 因为眨眼采用的sin()函数组成,所以其自然有幅值这一个属性。int amplitude = 40;// 创建一个用于保存幅值的变化的变量,采用amplitude的缩写amplint ampl = 0;// 判断是否到了幅值的临界值,由线程维护boolean flag = true;// 定义中心点坐标int centerX = 1024 / 2;int centerY = 768 / 2;// 创建统一的颜色背景int color = Color.GRAY;// 灰眼球的半径初始值int blackBallSemi = 25;Paint mPaint = new Paint();Handler mhandler;boolean first = true;private int eyeDis = (int) (angle/2*1.5);//两眼距离int degree = 0;//眼球转动角度int leftX = centerX+eyeDis;//左眼初始化坐标int RightX = centerX-eyeDis;//右眼初始化坐标private Point pointLeft = new Point(),pointRight = new Point(),centerLeft = new Point(),//左右中心坐标centerRight = new Point(),//右眼中心坐标tempLeft = new Point(),//左眼球坐标tempRight = new Point();//有眼球坐标public EyesJFrame(Context context, AttributeSet attrs) {super(context, attrs);startRun();mhandler = new Handler();color = context.getColor(R.color.skin);//初始化背景颜色}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);//重新初始化下面参数centerX = this.getMeasuredWidth()/2;centerY = this.getMeasuredHeight()/3;angle = this.getMeasuredWidth()/4;eyeDis = (int) (angle/2*1.5);amplitude = angle/6;blackBallSemi = amplitude / 2 - 6;leftX = centerX+eyeDis;RightX = centerX-eyeDis;pointLeft.x = leftX - blackBallSemi / 2 / 2;pointLeft.y = centerY - blackBallSemi / 2 / 2;centerLeft.x = leftX - blackBallSemi;centerLeft.y = centerY;pointRight.x = RightX + blackBallSemi / 2 / 2;pointRight.y =  centerY - blackBallSemi / 2 / 2;centerRight.x = RightX + blackBallSemi;centerRight.y = centerY;}private Runnable mRunnable = new Runnable() {// 界面的主线程@Overridepublic void run() {EyesJFrame.this.invalidate();}};//眼球转动private Runnable mRunnable1 = new Runnable() {// 界面的主线程@Overridepublic void run() {degree = 0;new Thread() {public void run() {while (true) {degree++;if (degree == 360) {//转一圈360度degree = 0;break;}calcNewPoint(tempLeft,pointLeft,centerLeft,degree);//计算左眼转动坐标calcNewPoint(tempRight,pointRight,centerRight,degree);计算右眼转动坐标mhandler.post(mRunnable); try {Thread.sleep(3);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}};}.start();}};private static void calcNewPoint(Point p1,Point p, Point pCenter, float angle) {  // calc arc   float l = (float) ((angle * Math.PI) / 180);  //sin/cos value  float cosv = (float) Math.cos(l);  float sinv = (float) Math.sin(l);  // calc new point  float newX = (float) ((p.x - pCenter.x) * cosv - (p.y - pCenter.y) * sinv + pCenter.x);  float newY = (float) ((p.x - pCenter.x) * sinv + (p.y - pCenter.y) * cosv + pCenter.y); p1.x = (int) newX;p1.y = (int) newY;//return new Point((int) newX, (int) newY);  }/*** 用线程维护眼睛的眨眼效果,线程结构如下: 1、该线程使用while(true)维护动态效果 2、ampl用于表示当前的眨眼效果的幅值*/public void startRun() {new Thread() {public void run() {while (true) {if (flag) {ampl++;if (ampl >= amplitude) {//眨眼幅度flag = false;}if (!first) {first = true;}} else {ampl--;if (ampl <= 0) {flag = true;}if (first) {mhandler.post(mRunnable1);try {Thread.sleep(3000);//3秒眨一次眼} catch (InterruptedException e) {e.printStackTrace();}first = false;}}try {Thread.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}mhandler.post(mRunnable);}};}.start();}@Overridepublic void onDraw(Canvas canvas) {drawLeft(canvas);//左眼drawRight(canvas);//右眼}private void drawLeft(Canvas canvas) {// 以centerX,centerY为中心,在眼睛所在的地方绘制一个白色的背景底色,// 长度为angle,宽为amplitude*2mPaint.setColor(Color.WHITE);for (int i = 0; i < angle; i++) {canvas.drawLine(leftX - angle / 2 + i, centerY, leftX - angle/ 2 + i, centerY- (int) (Math.sin(Math.PI * i / angle) * amplitude), mPaint);canvas.drawLine(leftX - angle / 2 + i, centerY, leftX - angle/ 2 + i, centerY+ (int) (Math.sin(Math.PI * i / angle) * amplitude), mPaint);}// 以centerX,centerY为中心,绘制一个灰色的眼球// 半径为blackBallSemi*2mPaint.setColor(Color.DKGRAY);canvas.drawCircle(leftX - blackBallSemi, centerY, blackBallSemi * 2,mPaint);// 以centerX,centerY为中心,绘制一个白色的瞳孔// 半径为blackBallSemi/2mPaint.setColor(Color.WHITE);canvas.drawCircle(tempLeft.x, tempLeft.y, blackBallSemi / 2, mPaint);// 使用和窗口一样的背景色将眼睛外框颜色去掉,这里使用sin()函数来完成// 在这里体现的方法其实就是画直线,把不需要的地方都画成与背景色相同的颜色mPaint.setColor(color);for (int i = 0; i < angle; i++) {canvas.drawLine(leftX - angle / 2 + i, centerY - amplitude,leftX - angle / 2 + i,centerY - (int) (Math.sin(Math.PI * i / angle) * ampl),mPaint);canvas.drawLine(leftX - angle / 2 + i, centerY + amplitude,leftX - angle / 2 + i,centerY + (int) (Math.sin(Math.PI * i / angle) * ampl),mPaint);}}private void drawRight(Canvas canvas) {// 长度为angle,宽为amplitude*2mPaint.setColor(Color.WHITE);for (int i = 0; i < angle; i++) {canvas.drawLine(RightX - angle / 2 + i, centerY, RightX - angle/ 2 + i, centerY- (int) (Math.sin(Math.PI * i / angle) * amplitude), mPaint);canvas.drawLine(RightX - angle / 2 + i, centerY, RightX - angle/ 2 + i, centerY+ (int) (Math.sin(Math.PI * i / angle) * amplitude), mPaint);}// 以centerX,centerY为中心,绘制一个灰色的眼球// 半径为blackBallSemi*2mPaint.setColor(Color.DKGRAY);canvas.drawCircle(RightX + blackBallSemi, centerY, blackBallSemi * 2,mPaint);// 以centerX,centerY为中心,绘制一个白色的瞳孔// 半径为blackBallSemi/2mPaint.setColor(Color.WHITE);/*canvas.drawCircle(RightX + blackBallSemi / 2 / 2, centerY- blackBallSemi / 2 / 2, blackBallSemi / 2, mPaint);*/canvas.drawCircle(tempRight.x, tempRight.y, blackBallSemi / 2, mPaint);// 使用和窗口一样的背景色将眼睛外框颜色去掉,这里使用sin()函数来完成// 在这里体现的方法其实就是画直线,把不需要的地方都画成与背景色相同的颜色mPaint.setColor(color);for (int i = 0; i < angle; i++) {canvas.drawLine(RightX - angle / 2 + i, centerY - amplitude,RightX - angle / 2 + i,centerY - (int) (Math.sin(Math.PI * i / angle) * ampl),mPaint);canvas.drawLine(RightX - angle / 2 + i, centerY + amplitude,RightX - angle / 2 + i,centerY + (int) (Math.sin(Math.PI * i / angle) * ampl),mPaint);}}}


//布局文件如下
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/background"
android:layout_width="match_parent"
android:background="@color/skin"
android:layout_height="match_parent">
<com.floatbubbleview.view.EyesJFrame
android:background="@android:color/transparent"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>

//颜色
<color name="skin">#EEE8CD</color>

android 眨眼效果相关推荐

  1. Android 抽屉效果Demo

    2019独角兽企业重金招聘Python工程师标准>>> Android 抽屉效果Demo. 转载:http://www.adobex.com/android/source/detai ...

  2. android中倒计时动画,简单实现Android倒计时效果

    本文实例为大家分享了Android倒计时效果的具体代码,供大家参考,具体内容如下 需求: a.在后台添加时,如果是今日直播,则需要添加开始时间(精确到秒): b.离开始时间超过1天,显示为:" ...

  3. 程序员表白神器。安卓程序员表白软件。程序员追女友利器=android+雪花效果+彩色气泡+心形花园+心形玫瑰花+相爱天数计时器

    程序员表白神器.安卓程序员表白软件.程序员追女友利器=android+雪花效果+彩色气泡+心形花园+心形玫瑰花 +相爱天数计时器. APK下载(把这个给女朋友,她一定会高兴的):http://down ...

  4. CSS3眨眼效果(animation动画循环间的“暂停”、“延时”执行)

    今天上午一直在纠结这个眨眼效果,我是用CSS3的animation来切换图片形成眨眼的效果,图片如下: 效果实现了但是眨眼很不自然,眨眼间是没有暂停的无限循环,开始的css代码是这样的: @keyfr ...

  5. android 圆角效果

    android 圆角效果 最近做一个效果,要一个上边两个角为圆角,下面两个角为直角的四边形白色背景: 如下图: 这里用到了shape属性中的corners 属性, api原文中是这样: <cor ...

  6. 【Unity3d Shader】眨眼效果

    眨眼效果常用于游戏中的剧情表现,先看效果图: 原理很简单: 椭圆公式: 当焦点在x轴时,椭圆的标准方程是:x^2/a^2+y^2/b^2=1,(a>b>0): 当焦点在y轴时,椭圆的标准方 ...

  7. Android 3D效果的实现

    系列文章目录 Android 3D效果的实现 文章目录 系列文章目录 前言 一.先看看聊天(需求) 二.实现效果 三.实现 1.通过getSystemService获得SensorManager实例对 ...

  8. Android动画效果之自定义ViewGroup添加布局动画

    Android动画效果之自定义ViewGroup添加布局动画 前言: 前面几篇文章介绍了补间动画.逐帧动画.属性动画,大部分都是针对View来实现的动画,那么该如何为了一个ViewGroup添加动画呢 ...

  9. 一个帖子掌握android所有控件、ProgressBar 、Android 动画效果、SQLite、四大组件、Android多媒体(转...

    Android多媒体实例大汇集(源码,全)经过两个星期的多媒体学习,实现了一系列DEMO,几乎涵盖了Android中对媒体中的各个方面(当然底层除外). http://www.apkbus.com/a ...

最新文章

  1. 什么是 ANSI C 和 GNU C
  2. Earliest PEP Algorithm Principles
  3. GitHub删除已有文件和提交文件的方法
  4. PAT L1-027 出租
  5. Get IAT Table
  6. mysql+order+in索引吗_mysql – 为什么ORDER BY不使用索引?
  7. 背包九讲(超值得看的一大坨资料,附代码、视频、资料...)
  8. eclipse中,jdk7和jdk8并存开发的实现方式
  9. 计算机指纹驱动程序,联想笔记本指纹识别驱动安装教程【详解】
  10. R数据分析:混合效应模型的可视化解释,再不懂就真没办法
  11. 华为路由器怎么看是不是公网_如何查看华为路由器默认ip地址
  12. uploadify文件上传插件使用教程
  13. python实现·数据结构与算法之单向链表
  14. UG NX 12 坐标系
  15. 华为路由器6to4隧道原理及配置
  16. ifft 快速傅里叶逆变换(Matlab)
  17. 为Word文档加水印使其更加美观(转)
  18. 苹果的黑科技:如何让按不动的触控板产生点按的感觉
  19. 软件项目研发过程中阶段划分和工作方法
  20. 计算机图形学常用算法实现9 梁友栋-Barskey裁剪算法

热门文章

  1. 加载插件时,提示反射异常,调用的目标出现异常,该模块应包含一个程序集清单
  2. 微信支付关键点技术解析
  3. 【只推荐一位】文能写诗聊妹,武可搬砖coding~
  4. Access数据库转换为SQL Server 2000数据库
  5. GDB使用手册(三)、如何启动及退出GDB调试(被调试程序的GDB启动及退出)
  6. T3S、T3M系列自组网电台系统软件视频使用说明
  7. php支付宝系列之电脑网站支付,一个PHP文件搞定支付宝之电脑网站支付
  8. c语言求一元二次函数根,编写求一元二次函数的根的函数 C
  9. 元宇宙日报1204 | 斯诺登表示玩家易受NFT剥削,小米投资张艺谋创立的VR公司...
  10. 什么是灵活用工?适用于哪些行业?