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

本文实例讲述了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程序设计有所帮助。

(0)

相关推荐

  • Android使用Canvas绘制圆形进度条效果

    前言 Android自定义控件经常会用到Canvas绘制2D图形,在优化自己自定义控件技能之前,必须熟练掌握Canvas绘图机制.本文从以下三个方面对Canvas绘图机制进行讲解: 画布Canvas 画笔Paint 示例圆形进度条 画布Canvas 首先,来看一下Android官网对Canvas类的定义: The Canvas class holds the "draw" calls.To draw something, you need 4 basic components: A B

  • Android自定义View之继承TextView绘制背景

    本文实例为大家分享了TextView绘制背景的方法,供大家参考,具体内容如下 效果: 实现流程: 1.初始化:对画笔进行设置 mPaintIn = new Paint(); mPaintIn.setAntiAlias(true); mPaintIn.setDither(true); mPaintIn.setStyle(Paint.Style.FILL); mPaintIn.setColor(getResources().getColor(R.color.colorPrimary)); mPain

  • Android编程实现ImageView图片抛物线动画效果的方法

    本文实例讲述了Android编程实现ImageView图片抛物线动画效果的方法.分享给大家供大家参考,具体如下: 想实现抛物线动画,必须知道抛物线的方程,这时候数学其作用了,假如有如图的抛物线: 按照抛物线的方程特别,知道任何的三点可以确定一条抛物线,由已知抛物线的标注 方程为 y = ax² + bx + c:假设A1坐标为(0,0),A2坐标为(300,0),A3坐标为(150,300):联合解方程得知该抛物线的方程为 y = -1/75 x² + 4x:由此方程,我们可以确定抛物线x和y的

  • Android自定义控件绘制基本图形基础入门

    本文讲述绘制Android自定义各种图形效果,为自定义控件的入门篇 相关视频链接: Android自定义控件系列 http://edu.csdn.net/course/detail/3719/65396 Android视频全系列 http://edu.csdn.net/course/detail/2741/43163 绘制点–这个控件只需要在布局中引用或者代码中new 即可,下面几个绘制只展示onDraw方法 package com.example.viewdemo1.view; import

  • Android使用自定义View绘制渐隐渐现动画

    实现了一个有趣的小东西:使用自定义View绘图,一边画线,画出的线条渐渐变淡,直到消失.效果如下图所示: 用属性动画或者渐变填充(Shader)可以做到一笔一笔的变化,但要想一笔渐变(手指不抬起边画边渐隐),没在Android中找到现成的API可用.所以,自己做了一个. 基本的想法是这样的: 在View的onTouchEvent中记录触摸点,生成一条一条的线LineElement,放在一个List中.给每个LineElement配置一个Paint实例. 在onDraw中绘制线段. 变换LineE

  • Android实现给TableLayou绘制边框的方法

    本文实例讲述了Android实现给TableLayou绘制边框的方法.分享给大家供大家参考,具体如下: 效果如下: 思路:使用share作为背景显示边框 步骤: 1.在res/drawable文件夹下建立table_frame_gray.xml文件: <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res

  • Android编程之canvas绘制各种图形(点,直线,弧,圆,椭圆,文字,矩形,多边形,曲线,圆角矩形)

    本文实例讲述了Android编程之canvas绘制各种图形的方法.分享给大家供大家参考,具体如下: 1.首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into

  • Android Path绘制贝塞尔曲线实现QQ拖拽泡泡

    这两天学习了使用Path绘制贝塞尔曲线相关,然后自己动手做了一个类似QQ未读消息可拖拽的小气泡,效果图如下: 最终效果图 接下来一步一步的实现整个过程. 基本原理 其实就是使用Path绘制三点的二次方贝塞尔曲线来完成那个妖娆的曲线的.然后根据触摸点不断绘制对应的圆形,根据距离的改变改变原始固定圆形的半径大小.最后就是松手后返回或者爆裂的实现. Path介绍: 顾名思义,就是一个路径的意思,Path里面有很多的方法,本次设计主要用到的相关方法有 moveTo() 移动Path到一个指定的点 qua

  • Android使用音频信息绘制动态波纹

    在一些音乐类应用中, 经常会展示随着节奏上下起伏的波纹信息, 这些波纹形象地传达了声音信息, 可以提升用户体验, 那么是如何实现的呢? 可以使用Visualizer类获取当前播放的声音信息, 并绘制在画布上, 使用波纹展示即可. 我来讲解一下使用方法. 主要 (1) Visualizer类提取波纹信息的方式. (2) 应用动态权限管理的方法. (3) 分离自定义视图的展示和逻辑. 1. 基础准备 Android 6.0引入动态权限管理, 在这个项目中, 会使用系统的音频信息, 因此把权限管理引入

  • Android抛物线下载动画制作过程

    下载动画经常出现在下载需求多的app中,比如游戏下载平台,应用市场-- 先看看效果图: 实现 private void startAnim() { //以bitmap创建new ImageView iv.setDrawingCacheEnabled(true); Bitmap bitmap = iv.getDrawingCache(); ImageView logo = new ImageView(this); logo.setScaleType(ImageView.ScaleType.FIT_

  • Android编程绘制圆形图片的方法

    本文实例讲述了Android编程绘制圆形图片的方法.分享给大家供大家参考,具体如下: 效果图如下: 第一步:新建RoundView自定义控件继承View package com.rong.activity; import com.rong.test.R; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.grap

随机推荐