Java中使用三角函数

通过一个简单的demo,学习三角函数的简单使用

注:使用三角函数的时候,不要直接Math.sin(x),这样是不对的,或者说,你传的30度,进去就不是30度了。要经过转换。详见代码

画一个播放用的view(一个圆,中间一个三角形)
1、效果图:
这里写图片描述
2、计算三角形坐标(拍的照片,有点模糊)
这里写图片描述
3、代码:
PlayIconView

package com.chen.demo;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

public class PlayIconView extends View {

    //圆的画笔
    private Paint circlePaint;

    //圆的边
    private Paint strokePaint;

    private int view_width;
    private int view_height;

    //三角形左上角点坐标
    private double point_1_x;
    private double point_1_y;

    //三角形右下角点坐标
    private double point_2_x;
    private double point_2_y;

    //三角形右侧点坐标
    private double point_3_x;
    private double point_3_y;

    private Paint trianglePaint;

    private Path trianglePath;


    public PlayIconView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    public PlayIconView(Context context) {
        super(context);
        init();
    }

    public PlayIconView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        Log.e("chen", "onSizeChanged");
        view_width = w;
        view_height = h;

        calculateCoordinate();

    }

    /**
     * 计算坐标
     */
    private void calculateCoordinate() {

        point_1_x = (1 / 2d - 1 / (4 * Math.tan(60 * Math.PI / 180))) * view_width;
        point_1_y = view_width / 4d;

        point_2_x = point_1_x;
        point_2_y = view_width * 3 / 4d;

        point_3_x = (1 / 2d + 1 / (4 * Math.sin(60 * Math.PI / 180))) * view_width;
        point_3_y = view_height / 2d;

        trianglePath.moveTo((float) point_1_x, (float) point_1_y);
        trianglePath.lineTo((float) point_2_x, (float) point_2_y);
        trianglePath.lineTo((float) point_3_x, (float) point_3_y);
        trianglePath.close();

    }

    /**
     * 初始化
     */
    private void init() {

        //背景圆画笔
        circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
        circlePaint.setStyle(Paint.Style.FILL);
        circlePaint.setColor(0x33000000);

        //圆边画笔
        strokePaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
        strokePaint.setStyle(Paint.Style.STROKE);
        strokePaint.setStrokeWidth(1);
        strokePaint.setColor(0xccffffff);

        //三角形画笔
        trianglePaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
        trianglePaint.setStyle(Paint.Style.FILL);
        trianglePaint.setColor(0xffffffff);

        //闭合区间路径
        trianglePath = new Path();

    }


    @Override
    protected void onDraw(Canvas canvas) {

        canvas.drawCircle(view_width / 2f, view_height / 2f, view_width / 2f, circlePaint);
        canvas.drawCircle(view_width / 2f, view_height / 2f, view_width / 2f - 1, strokePaint);

        canvas.drawPath(trianglePath, trianglePaint);

    }
}

4、布局文件中使用:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@mipmap/ic_launcher"
    >


    <com.chen.demo.PlayIconView
        android:id="@+id/play_icon"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_centerInParent="true"
        />


</RelativeLayout>

5、Activity:

package com.chen.demo;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

public class MainActivity extends Activity {

    private PlayIconView play_icon;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

        play_icon = (PlayIconView) findViewById(R.id.play_icon);

    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值