切水果 java_Android上的水果忍者刀锋效果(JAVA实现)
显示刀锋的View
package com.wbhuang.myninjia;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
/**
* @author wbhuang
* 20130821
*/
public class ShadeView extends View {
static final int MAX_POINTS_NUM = 10;
static final float CENTER_RATIO = 0.5f;
static final float SHAPE_RATIO = 0.02f;
//点类
static class Vertex {
public float x;
public float y;
public Vertex() {}
public Vertex(float x, float y) {
this.x = x;
this.y = y;
}
}
List leftVertexs = new ArrayList(MAX_POINTS_NUM);//刀锋上边线点集
List rightVertexs = new ArrayList(MAX_POINTS_NUM);//刀锋下边线点集
List sampleVertexs = new ArrayList(MAX_POINTS_NUM);//刀锋路径的点集
float shape_width = 10;
private Paint paint;
private static final int gestureColor = Color.rgb(153, 153, 153);
private static final int alpha = 220;
private static final int alpha_full = 255;
private static long last_time;
private static final int MIN_TIME_INTERVAL = 10;
public ShadeView(Context context) {
super(context);
paint = new Paint();
paint.setStyle(Paint.Style.FILL);
DisplayMetrics metric = new DisplayMetrics();
((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(metric);
int width = metric.widthPixels;
shape_width = width * SHAPE_RATIO;//刀锋长度
}
//计算路径上面和下面的点集
private void calcVertexs() {
int len = sampleVertexs.size();
leftVertexs.clear();
rightVertexs.clear();
for (int i = 1; i < len; i++) {
Vertex cur = sampleVertexs.get(i);
Vertex pre = sampleVertexs.get(i-1);
Vertex center = new Vertex();
center.x = cur.x - (cur.x - pre.x) * CENTER_RATIO;
center.y = cur.y - (cur.y - pre.y) * CENTER_RATIO;
float w = cur.x - pre.x;
float h = cur.y - pre.y;
double angle = Math.atan(h/w);
Vertex leftVertex = new Vertex();
Vertex rightVertex = new Vertex();
float centerShapeWidth = shape_width * i / len;
if (i == (len - 2))
centerShapeWidth = shape_width;
if (cur.x > pre.x) {
leftVertex.x = (float) (center.x + Math.sin(angle) * centerShapeWidth);
leftVertex.y = (float) (center.y - Math.cos(angle) * centerShapeWidth);
rightVertex.x = (float) (center.x - Math.sin(angle) * centerShapeWidth);
rightVertex.y = (float) (center.y + Math.cos(angle) * centerShapeWidth);
} else {
rightVertex.x = (float) (center.x + Math.sin(angle) * centerShapeWidth);
rightVertex.y = (float) (center.y - Math.cos(angle) * centerShapeWidth);
leftVertex.x = (float) (center.x - Math.sin(angle) * centerShapeWidth);
leftVertex.y = (float) (center.y + Math.cos(angle) * centerShapeWidth);
}
leftVertexs.add(leftVertex);
rightVertexs.add(rightVertex);
}
}
@Override
public void onDraw(Canvas canvas) {
Path path = new Path();
if (sampleVertexs.size() > 1) {
calcVertexs();
Vertex begin = sampleVertexs.get(0);
Vertex end = sampleVertexs.get(sampleVertexs.size()-1);
path.moveTo(begin.x, begin.y);
for (int i= 0; i < leftVertexs.size(); i++) {
Vertex vertex = leftVertexs.get(i);
path.lineTo(vertex.x, vertex.y);
}
path.lineTo(end.x, end.y);
for (int i = rightVertexs.size() - 1; i > 0; i--) {
Vertex vertex = rightVertexs.get(i);
path.lineTo(vertex.x, vertex.y);
}
paint.setColor(Color.WHITE);
paint.setAlpha(alpha_full);
canvas.drawPath(path, paint);
}
super.onDraw(canvas);
}
@Override
public boolean onTouchEvent(android.view.MotionEvent event) {
if(event.getPointerCount() == 1){
int action = event.getAction();
if (MotionEvent.ACTION_DOWN == action) {
leftVertexs.clear();
rightVertexs.clear();
sampleVertexs.clear();
} else if (MotionEvent.ACTION_MOVE == action) {
//if (event.getEventTime() - last_time > MIN_TIME_INTERVAL) {
last_time = event.getEventTime();
if (sampleVertexs.size() > MAX_POINTS_NUM) {
sampleVertexs.remove(0);
}
Vertex vertex = new Vertex(event.getX(), event.getY());
sampleVertexs.add(vertex);
//}
} else if (MotionEvent.ACTION_UP == action) {
leftVertexs.clear();
rightVertexs.clear();
sampleVertexs.clear();
}
this.invalidate();
}
return true;
}
}
package com.wbhuang.myninjia;
import android.app.Activity;
import android.os.Bundle;
public class NinjiaActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new ShadeView(this));
}
}
切水果 java_Android上的水果忍者刀锋效果(JAVA实现)相关推荐
- 基于Django的水果线上销售平台
1,项目功能: 后台: (1)水果管理:该模块主要实现水果的添加,修改,删除以及查看功能. (2)用户管理:主要实现对用户的添加,修改,删除和查看功能. (3)发货管理:主要实现多水果订单的发货,修改 ...
- Python+Yolov5果树上的水果(苹果)检测识别
程序示例精选 Python+Yolov5果树上的水果(苹果)检测识别 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对<<Python+Yo ...
- android水果忍者源码,android 水果忍者的 刀锋 效果实现源码
[实例简介] android 水果忍者的 刀锋 效果实现源码 [实例截图] [核心代码] 54532水果忍者Ninjia └── Ninjia ├── AndroidManifest.xml ├── ...
- 开水果店常见的贮藏保鲜方法,开水果店有哪些水果保鲜的办法
1.要懂得一些保鲜不当的操作 很多利润高的水果因为控制损耗不当就会做亏.水果打包的时候,不要密封死,水果有呼吸作用,要保持空气流动,空气不流通,积压的水汽容易加速水果的腐烂.像梨子类的,开箱来的时候每 ...
- 西红柿文案:怎么写西红柿水果的文案,水果西红柿售卖文案
水果行业专业朋友圈营销文案,同行朋友圈运营精选水果文案大全.水果文案已更新300多类的水果,千条文案和图片,复制轻松发朋友圈. 1.怎么能看到这些朋友圈文案 朋友圈下的搜一搜,搜鲁班文案,找出来的文章 ...
- java吃水果小游戏中水果,蔬菜等的重画
1,首先定义成员变量:protected int frequency=45; 表示水果重画次数 2,然后在类中建造一个画笔,及方法中有参数(Graphics g), 调用面板方法(最好是该类继承面板) ...
- 水果店圈子:水果店坏水果应该怎么处理,水果店卖剩下的水果如何处理
这里是水果店老板同行共享圈子,持续分享,帮助新手入门. 1.有想法要去执行 水果店想到了就去做,做的当中会遇到问题,问题就慢慢想办法解决,最主要是要行动起来 .这世上没有100%的绝对,不可能有一个办 ...
- 天猫年货节“种果树、收水果”破除你的“水果焦虑”
文|曾响铃 来源|科技向令说(xiangling0815) 元旦已过,眼看农历新年马上来临,又到了一年一度"囤货"的季节.有一类产品的"热度"从2019年春节期 ...
- 如何打理水果店,夏天水果店怎么打理
1.注意水果相互之间有催化作用 哪些水果不能喷水,哪些水果不能放一起,否则相互催熟等等,这些是基础的运营常识,水果很多,这些知识都要常常看看,很多水果店老板每天都在背诵或者做笔记让自己记住.比如葡萄. ...
最新文章
- 在MVVM实践中的Command与CommandParameter的使用
- CentOS安装网络代理软件
- LaTex 各种特殊符号
- C语言const专题
- pom.xml详细说明
- 工业以太网交换机的产品性能有哪些呢?
- Struts1.x在MyEclipse中的环境搭建和配置
- 一张图看懂UML 类图
- 索引体积_第16期:索引设计(MySQL 的索引结构)
- 使用Seam Framework + JBoss 5.0 开发第一个Web应用 - 简单投票程序
- 【hdoj1272】小希的迷宫(并查集+坑点)
- 为啥一到秋季就鼻塞、流鼻涕、打喷嚏?该如何是好?别总当成感冒
- 揭秘:全球第一张云安全国际认证金牌得主
- 『光纤交换机级联设置 』光纤跳线及光纤交换机端口级联类型
- 关于人工智能的一些介绍与看法
- 手机相机里面的m_手机里面照相机的像素怎么调
- item_search_img - 按图搜索淘宝商品(拍立淘)
- 备战面试日记(3.3) - (设计模式.23种设计模式之结构型模式)
- html如何设置下拉列表
- 一张图看清国内程序员的分布数量
热门文章
- CSS常用选择器(通配符选择器,标签选择器,类选择器,id选择器.....),你知道多少?
- DVWA通关--存储型XSS(XSS (Stored))
- linux gdb添加符号表,gdb – 什么是符号表,它如何集成到可执行文件中?
- 跳槽:三年五年一个坎
- powershell运行cmd命令时出错The token ‘‘ is not a valid statement separator in this version.
- Java和Python语言比较
- h5页面唤起app(iOS和Android),没有安装则跳转下载页面
- 老域名的好处 新网站快速收录排名
- Layui的行内数据的获取
- java修饰符总结,关于Java中修饰符的总结(fina除外)