显示刀锋的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实现)相关推荐

  1. 基于Django的水果线上销售平台

    1,项目功能: 后台: (1)水果管理:该模块主要实现水果的添加,修改,删除以及查看功能. (2)用户管理:主要实现对用户的添加,修改,删除和查看功能. (3)发货管理:主要实现多水果订单的发货,修改 ...

  2. Python+Yolov5果树上的水果(苹果)检测识别

    程序示例精选 Python+Yolov5果树上的水果(苹果)检测识别 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对<<Python+Yo ...

  3. android水果忍者源码,android 水果忍者的 刀锋 效果实现源码

    [实例简介] android 水果忍者的 刀锋 效果实现源码 [实例截图] [核心代码] 54532水果忍者Ninjia └── Ninjia ├── AndroidManifest.xml ├── ...

  4. 开水果店常见的贮藏保鲜方法,开水果店有哪些水果保鲜的办法

    1.要懂得一些保鲜不当的操作 很多利润高的水果因为控制损耗不当就会做亏.水果打包的时候,不要密封死,水果有呼吸作用,要保持空气流动,空气不流通,积压的水汽容易加速水果的腐烂.像梨子类的,开箱来的时候每 ...

  5. 西红柿文案:怎么写西红柿水果的文案,水果西红柿售卖文案

    水果行业专业朋友圈营销文案,同行朋友圈运营精选水果文案大全.水果文案已更新300多类的水果,千条文案和图片,复制轻松发朋友圈. 1.怎么能看到这些朋友圈文案 朋友圈下的搜一搜,搜鲁班文案,找出来的文章 ...

  6. java吃水果小游戏中水果,蔬菜等的重画

    1,首先定义成员变量:protected int frequency=45; 表示水果重画次数 2,然后在类中建造一个画笔,及方法中有参数(Graphics g), 调用面板方法(最好是该类继承面板) ...

  7. 水果店圈子:水果店坏水果应该怎么处理,水果店卖剩下的水果如何处理

    这里是水果店老板同行共享圈子,持续分享,帮助新手入门. 1.有想法要去执行 水果店想到了就去做,做的当中会遇到问题,问题就慢慢想办法解决,最主要是要行动起来 .这世上没有100%的绝对,不可能有一个办 ...

  8. 天猫年货节“种果树、收水果”破除你的“水果焦虑”

    文|曾响铃 来源|科技向令说(xiangling0815) 元旦已过,眼看农历新年马上来临,又到了一年一度"囤货"的季节.有一类产品的"热度"从2019年春节期 ...

  9. 如何打理水果店,夏天水果店怎么打理

    1.注意水果相互之间有催化作用 哪些水果不能喷水,哪些水果不能放一起,否则相互催熟等等,这些是基础的运营常识,水果很多,这些知识都要常常看看,很多水果店老板每天都在背诵或者做笔记让自己记住.比如葡萄. ...

最新文章

  1. 在MVVM实践中的Command与CommandParameter的使用
  2. CentOS安装网络代理软件
  3. LaTex 各种特殊符号
  4. C语言const专题
  5. pom.xml详细说明
  6. 工业以太网交换机的产品性能有哪些呢?
  7. Struts1.x在MyEclipse中的环境搭建和配置
  8. 一张图看懂UML 类图
  9. 索引体积_第16期:索引设计(MySQL 的索引结构)
  10. 使用Seam Framework + JBoss 5.0 开发第一个Web应用 - 简单投票程序
  11. 【hdoj1272】小希的迷宫(并查集+坑点)
  12. 为啥一到秋季就鼻塞、流鼻涕、打喷嚏?该如何是好?别总当成感冒
  13. 揭秘:全球第一张云安全国际认证金牌得主
  14. 『光纤交换机级联设置 』光纤跳线及光纤交换机端口级联类型
  15. 关于人工智能的一些介绍与看法
  16. 手机相机里面的m_手机里面照相机的像素怎么调
  17. item_search_img - 按图搜索淘宝商品(拍立淘)
  18. 备战面试日记(3.3) - (设计模式.23种设计模式之结构型模式)
  19. html如何设置下拉列表
  20. 一张图看清国内程序员的分布数量

热门文章

  1. CSS常用选择器(通配符选择器,标签选择器,类选择器,id选择器.....),你知道多少?
  2. DVWA通关--存储型XSS(XSS (Stored))
  3. linux gdb添加符号表,gdb – 什么是符号表,它如何集成到可执行文件中?
  4. 跳槽:三年五年一个坎
  5. powershell运行cmd命令时出错The token ‘‘ is not a valid statement separator in this version.
  6. Java和Python语言比较
  7. h5页面唤起app(iOS和Android),没有安装则跳转下载页面
  8. 老域名的好处 新网站快速收录排名
  9. Layui的行内数据的获取
  10. java修饰符总结,关于Java中修饰符的总结(fina除外)