欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android编程绘制抛物线的方法示例

程序员文章站 2023-11-29 20:28:46
本文实例讲述了android编程绘制抛物线的方法。分享给大家供大家参考,具体如下: package com.yarin.android.examples_05_0...

本文实例讲述了android编程绘制抛物线的方法。分享给大家供大家参考,具体如下:

package com.yarin.android.examples_05_04;
import java.util.hashset;
import java.util.iterator;
import java.util.linkedlist;
import java.util.list;
import java.util.set;
import android.content.context;
import android.graphics.canvas;
import android.graphics.color;
import android.graphics.paint;
import android.graphics.rect;
import android.util.log;
import android.view.keyevent;
import android.view.motionevent;
import android.view.view;
import android.widget.toast;
public class gameview extends view implements runnable
{
  /* 声明paint对象 */
  private paint mpaint = null;
  double maxs = 0;
  double maxh = 0;
  double maxt = 0;
  double dx;
  double dy;
  double d;
  movingobject obj;
  boolean isdraw=false;
  public gameview(context context)
  {
    super(context);
    /* 构建对象 */
    mpaint = new paint();
    // 计算物体的最大高度、运动时间及最大射程
    obj = new movingobject(30, math.pi / 4, color.red);
    // 运行时间
    obj.t = 2 * obj.v0 * math.sin(obj.sita) / 9.8;
    // 最大高度
    obj.h = obj.v0 * obj.v0 * math.sin(obj.sita) * math.sin(obj.sita)
        / (2 * 9.8);
    // 最大射程
    obj.smax = 2 * obj.v0 * obj.v0 * math.sin(obj.sita)
        * math.cos(obj.sita) / 9.8;
    if (obj.smax > maxs)
    {
      maxs = obj.smax;
    }
    if (obj.h > maxh)
    {
      maxh = obj.h;
    }
    if (obj.t > maxt)
    {
      maxt = obj.t;
    }
    dx = (800 - 20) / maxs;
    dy = (480 - 20) / maxh;
    d = math.min(dx, dy);
    //最大运行时间
    log.v("tag", string.valueof(maxt));
    //最大高度
    log.v("tag", string.valueof(maxh));
    //最大射程
    log.v("tag", string.valueof(maxs));
  }
  public void ondraw(canvas canvas)
  {
    super.ondraw(canvas);
    /* 设置画布的颜色 */
    canvas.drawcolor(color.black);
    /* 设置取消锯齿效果 */
    mpaint.setantialias(true);
    canvas.drawcolor(color.green);
    if(isdraw)
    {
      canvas.drawcircle((float)obj.x, (float)obj.y, 10, mpaint);
    }
  }
  // 触笔事件
  public boolean ontouchevent(motionevent event)
  {
    switch (event.getaction())
    {
    case motionevent.action_down:
      new thread(this).start();
      break;
    }
    return true;
  }
  public void run()
  {
    for (double t = 0; t < maxt; t += 0.01)
    {
      log.v("tag", string.valueof(t));
      isdraw=true;
      // 水平坐标
      double x = obj.v0 * math.cos(obj.sita) * t;
      // 竖直坐标
      double y = obj.v0 * math.sin(obj.sita) * t - 9.8 * t * t / 2;
      if (y < 0)
      {
        continue;
      }
      // 坐标转换
      obj.x = 10 + d * x;
      obj.y = 480 - 10 - d * y;
      try
      {
        thread.sleep(10);
      } catch (interruptedexception e)
      {
        thread.currentthread().interrupt();
      }
      // 使用postinvalidate可以直接在线程中更新界面
      postinvalidate();
    }
  }
}
class movingobject
{
  // 重力加速度
  public final double g = 9.8;
  // / <summary>
  // / 构造函数
  // / </summary>
  // / v0物体的初速度
  // / sita物体初速度与水平方向的夹角
  // / color颜色
  public movingobject(double v0, double sita, int red)
  {
    this.v0 = v0;
    this.sita = sita;
    this.color = red;
  }
  // / <summary>
  // / 物体的初速度
  // / </summary>
  public double v0;
  // / <summary>
  // / 物体初速度与水平方向的夹角
  // / </summary>
  public double sita;
  // / <summary>
  // / 物体的横坐标
  // / </summary>
  public double x;
  // / <summary>
  // / 物体的纵坐标
  // / </summary>
  public double y;
  // 物体的颜色
  public int color;
  // 要绘制的物体的矩形
  public rect getobjectrectangle()
  {
    return new rect((int) x - 3, (int) y - 3, 6, 6);
  }
  // / <summary>
  // / 最大射程
  // / </summary>
  public double smax;
  // / <summary>
  // / 最大高度
  // / </summary>
  public double h;
  // / <summary>
  // / 运行时间
  // / </summary>
  public double t;
}

更多关于android相关内容感兴趣的读者可查看本站专题:《android图形与图像处理技巧总结》、《android开发入门与进阶教程》、《android调试技巧与常见问题解决方法汇总》、《android基本组件用法总结》、《android视图view技巧总结》、《android布局layout技巧总结》及《android控件用法总结

希望本文所述对大家android程序设计有所帮助。