通过一个简单的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);
}
}