package com.hesheng.myapplication;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.View;
import android.view.WindowManager; /**
* Created by wangchaomac on 2017/11/25.
*/
public class CounterView extends android.support.v7.widget.AppCompatImageView implements View.OnClickListener { // // 定义画笔
// private Paint mPaint;
// 用于获取文字的宽和高
private Rect mBounds;
// 计数值,每点击一次本控件,其值增加1
private int mCount; private int width;
private int height;
private float scale;
private float px1 = 450;//450
private float py1 = 450;//450
private float px = 0;//300
private float py = 0;//300
private float px2 = 0;//300
private float py2 = 0;//750 // private float px1 = 500;
// private float py1 = 600;
// private float px = 300;
// private float py = 300;
// private float px2 = 300;
// private float py2 = 900; private double i = 0;
private boolean isStart = false;
private boolean isInit = true; public float getPx() {
return px;
} public float getPy() {
return py;
} private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0:
if (isStart) { // if(i>2)
// {
// isStart = false;
// return;
// }
i += 1;
double y = (Math.PI * i) / 180;
if (i <= 360) {
if( i<= 90){ px = (float)radio + radio * (float) Math.sin(y);
py = (float)radio - radio * (float) Math.cos(y); px2 = (float)radio - radio * (float) Math.sin(y);
py2 = (float)radio + radio * (float) Math.cos(y);
}
else { px = radio + radio * (float) Math.sin(y);
py = radio - radio * (float) Math.cos(y); px2 = radio - radio * (float) Math.sin(y);
py2 = radio + radio * (float) Math.cos(y);
}
// px = radio + radio * (float) Math.sin(y);
// py = radio - radio * (float) Math.cos(y);
//
//
//
// px2 = radio - radio * (float) Math.sin(y);
// py2 = radio + radio * (float) Math.cos(y); if (i == 360) {
i = 0;
} } invalidate();
// handler.sendEmptyMessageDelayed(0,10);
}
break;
default:
break;
}
};
}; private void getWindow(Context context) {
WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
scale = context.getResources().getDisplayMetrics().density;
} //写一个drawble转BitMap的方法
private Bitmap drawableToBitmap(Drawable drawable) {
if (drawable instanceof BitmapDrawable) {
BitmapDrawable bd = (BitmapDrawable) drawable;
return bd.getBitmap();
}
int w = drawable.getIntrinsicWidth();
int h = drawable.getIntrinsicHeight();
Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, w, h);
drawable.draw(canvas);
return bitmap;
}
private Paint mPaint; //画笔 private int mRadius; //圆形图片的半径 // @Override
// protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// //因为是圆形图片,所以应该让宽高保持一致
// int size = Math.min(getMeasuredWidth(), getMeasuredHeight());
// mRadius = size / 2;
//
// setMeasuredDimension(size, size);
// } private float mScale; //图片的缩放比例
// @Override
// protected void onDraw(Canvas canvas) {
// super.onDraw(canvas);
// Paint paint = new Paint();
// paint.setStyle(Paint.Style.STROKE);
// paint.setColor(Color.BLACK);
// canvas.drawCircle(px1, py1, radio, paint);
//
// Paint paint2 = new Paint();
// paint2.setStyle(Paint.Style.FILL);
// paint2.setColor(Color.BLACK);
// canvas.drawCircle( px + 200 , py + 600 ,10, paint2);
////
// Paint paint3 = new Paint();
// paint3.setStyle(Paint.Style.FILL);
// paint3.setColor(Color.BLACK);
// if(isInit){
// canvas.drawCircle( px2+200 , 300 ,10, paint3);
// isInit = false;
// System.out.println(" py2 = "+py2);
// return;
// }
//
// canvas.drawCircle( px2+200 , py2 + 300 ,10, paint3);
// } public void start() {
isStart = true;
handler.sendEmptyMessageDelayed(0, 100);
} public void stop() {
isStart = false;
} public CounterView(Context context, AttributeSet attrs) {
super(context, attrs); // 初始化画笔、Rect
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mBounds = new Rect();
// 本控件的点击事件
setOnClickListener(this);
getWindow(context); } private float radio = 300; /**
* 比onDraw先执行
* <p>
* 一个MeasureSpec封装了父布局传递给子布局的布局要求,每个MeasureSpec代表了一组宽度和高度的要求。
* 一个MeasureSpec由大小和模式组成
* 它有三种模式:UNSPECIFIED(未指定),父元素部队自元素施加任何束缚,子元素可以得到任意想要的大小;
* EXACTLY(完全),父元素决定自元素的确切大小,子元素将被限定在给定的边界里而忽略它本身大小;
* AT_MOST(至多),子元素至多达到指定大小的值。
* <p>
* 它常用的三个函数:
* 1.static int getMode(int measureSpec):根据提供的测量值(格式)提取模式(上述三个模式之一)
* 2.static int getSize(int measureSpec):根据提供的测量值(格式)提取大小值(这个大小也就是我们通常所说的大小)
* 3.static int makeMeasureSpec(int size,int mode):根据提供的大小值和模式创建一个测量值(格式)
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
final int minimumWidth = getSuggestedMinimumWidth();
final int minimumHeight = getSuggestedMinimumHeight(); int width = measureWidth(minimumWidth, widthMeasureSpec);
int height = measureHeight(minimumHeight, heightMeasureSpec); radio = getMeasuredWidth()/ 2; px = Math.min(width,height) / 2;
py = 0;
px2 = Math.min(width,height) / 2;
py2 = Math.min(width,height) / 2;
setMeasuredDimension(width, height);
} private int measureWidth(int defaultWidth, int measureSpec) { int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec); switch (specMode) {
case MeasureSpec.AT_MOST:
defaultWidth = getPaddingLeft() + getPaddingRight();
break;
case MeasureSpec.EXACTLY: defaultWidth = specSize;
break;
case MeasureSpec.UNSPECIFIED: defaultWidth = Math.max(defaultWidth, specSize);
}
return defaultWidth;
} private int measureHeight(int defaultHeight, int measureSpec) { int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec); switch (specMode) {
case MeasureSpec.AT_MOST:
defaultHeight = getPaddingTop() + getPaddingBottom(); break;
case MeasureSpec.EXACTLY:
defaultHeight = specSize; break;
case MeasureSpec.UNSPECIFIED:
defaultHeight = Math.max(defaultHeight, specSize); // 1.基准点是baseline
// 2.ascent:是baseline之上至字符最高处的距离
// 3.descent:是baseline之下至字符最低处的距离
// 4.leading:是上一行字符的descent到下一行的ascent之间的距离,也就是相邻行间的空白距离
// 5.top:是指的是最高字符到baseline的值,即ascent的最大值
// 6.bottom:是指最低字符到baseline的值,即descent的最大值 break;
}
return defaultHeight; } @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas); //mPaint.setColor(Color.WHITE);
// 绘制一个填充色为蓝色的矩形
//canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint);
// canvas.drawCircle( getWidth()/2, getHeight()/2,radio, mPaint);
// mPaint.setColor(Color.YELLOW);
// mPaint.setTextSize(50);
// String text = String.valueOf(mCount);
// // 获取文字的宽和高
// mPaint.getTextBounds(text, 0, text.length(), mBounds);
// float textWidth = mBounds.width();
// float textHeight = mBounds.height();
//
// // 绘制字符串
// canvas.drawText(text, getWidth() / 2 - textWidth / 2, getHeight() / 2
// + textHeight / 2, mPaint); // System.out.println("px1 = "+ px1 + " py1 =" +py1);
//
// Paint paint = new Paint();
// paint.setStyle(Paint.Style.STROKE);
// paint.setColor(Color.BLACK);
// canvas.drawCircle(px1, py1, radio, paint); Paint paint2 = new Paint();
paint2.setStyle(Paint.Style.FILL);
paint2.setColor(Color.GREEN);
//px+150 py+150
canvas.drawCircle(px , py ,4, paint2);
//
Paint paint3 = new Paint();
paint3.setStyle(Paint.Style.FILL);
paint3.setColor(Color.RED);
if(isInit){
//px+150 py+150
canvas.drawCircle(px2 , py2 ,4, paint3);
isInit = false;
System.out.println(" py2 = "+py2);
return;
}
//px+150 py+150
//canvas.drawCircle( px2+200 , py2 + 300 ,10, paint3);
// canvas.drawCircle( px2+200 , py2 + 300 ,10, paint3);
canvas.drawCircle(px2 ,py2 ,4, paint3); handler.sendEmptyMessageDelayed(0, 100); isStart = true;
} @Override
public void onClick(View v) {
mCount ++; // 重绘
// invalidate();
} }

记录code修改的更多相关文章

  1. A、B同时打开一个页面进行同一条数据库记录进行修改,A修改完成后提交表单,A修改的数据保存完成后;当B也修改完成后,提交数据进行数据修改。此时B修改的内容会覆盖A修改的内容,请问如何避免?

    A.B同时打开一个页面进行数据中的一条数据进行修改,A修改完成后提交表单,数据修改保存完成后B开始页面也修改完成,开始提交进行修改.此时B修改的内容会覆盖A的内容,请问如何避免? 通过搜索和我个人总结 ...

  2. 在EntityFrameworkCore中记录EF修改日志,保存,修改字段的原始值,当前值,表名等信息

    突发奇想,想把业务修改的所有字段原始值和修改后的值,做一个记录,然后发现使用EF可以非常简单的实现这个功能 覆盖父类中的 SaveShanges() 方法 public new int SaveCha ...

  3. 源码详解openfire保存消息记录_修改服务端方式

    实现openfire消息记录通常有两种方式,修改服务端和添加消息记录插件. 今天,简单的说明一下修改服务端方式实现消息记录保存功能. 实现思路 修改前: 默认的,openfire只提供保存离线记录至o ...

  4. Visual Studio Code 修改字体

    下载安装想要更换的字体,这里以 Fira Code 字体为例. Fira Code 字体的下载地址:https://github.com/tonsky/FiraCode 下载解压后安装字体,windo ...

  5. POJ 2155 二维线段树 经典的记录所有修改再统一遍历 单点查询

    本来是想找一个二维线段树涉及懒惰标记的,一看这个题,区间修改,单点查询,以为是懒惰标记,敲到一半发现这二维线段树就不适合懒惰标记,你更新了某段的某列,但其实其他段的相应列也要打标记,但因为区间不一样, ...

  6. Ruby应用记录:修改文件中某个字符串

    #修改android客户端中服务器地址的默认值为对应环境的服务器地址 #!/usr/bin/ruby ostr="192.168.88.95:8088" nstr="19 ...

  7. Idea使用记录--每次修改JS文件都需要重启Idea才能生效解决方法

    最近开始使用Idea,有些地方的确比eclipse方便.但是我发现工程每次修改JS或者是JSP页面后,并没有生效,每次修改都需要重启一次Tomcat这样的确不方便.我想Idea肯定有设置的方法,不可能 ...

  8. SAE设置记录:修改config.yaml实现地址重写和修改固定链接

    刚搭建完sae博客后闲置下来了,偶尔写两篇文章,最近想整理整理sae,于是开始. 刚新建完博客修改固定链接,可是保存后直接访问出现问题,访问不到文章了,而且我的博客地址前面会出现"1.&qu ...

  9. VS code 修改主题设置代码对其齐线

    用VS Code 写代码的时候有时候缩进太多就不知道对应的是哪一个标签了,那么可不可以让它显示缩进参考线,这样就清楚的多了.答案是肯定的,方法如下: 找到 文件-->首选项——>设置→搜索 ...

随机推荐

  1. pipenv 虚拟环境新玩法

    首先,虚拟环境本质是一个文件,是为了适应不同的项目而存在.pipenv相当于virtualenv和pip的合体. pipenv主要有以下特性: (1)pipenv集成了pip,virtualenv两者 ...

  2. es6-函数的扩展

    /* * 1:函数参数的默认值 * */ !(() => { function f(x, y = 1, z = 1, g = 1) { console.log(x, y, z, g);//1,1 ...

  3. 服务端模拟http服务请求客户端

    try { InputStream in = req.getInputStream(); int i = -1; ByteArrayOutputStream out = new ByteArrayOu ...

  4. IO概念解析------同步异步阻塞非阻塞

    各个IO Model的比较如图所示: 阻塞和非阻塞强调的是程序在等待调用结果(消息,返回值)时的状态.  阻塞调用是指调用结果返回之前,当前线程会被挂起.调用线程只有在得到结果之后才会返回.非阻塞调用 ...

  5. 【OpenCV-Python】-几何变换

    涉及函数: cv2.getPerspectiveTransform()cv2.warpAffine() 接收的参数是2✖️3的变换矩阵cv2.warpPerspective() 接收的参数是3✖️3的 ...

  6. (转)linux shell 数字计算详解

    代码中免不了要进行各种数据计算.抛开科学计算不提,普通的计算占地,百分比,同比,环比等需求就很常见.linux shell中进行数字计算,主要有如下几种方式: 1.bc bc是比较常用的linux计算 ...

  7. 通过IntelliJ IDEA忽略掉不需要提交到github的文件

    现如今,开源项目越来越多,存储容器主要有github,国内的码云.开源贡献也是衡量一个开发者是否具有足够的包容能力.技术能力的重要标准. 有些开发者没注意到这些,好心提交开源项目,配置文件也提交上去, ...

  8. Magento 2中文文档教程 - Magento 2.1.x 系统需求

    Magento 2.1.x 系统需求 操作系统 (Linux x86-64) Linux发行版如红帽企业Linux(RHEL),CentOS,Ubuntu,Debian,等等 内存需求 升级的应用程序 ...

  9. android socket 通讯(客户端) 发送数据

    /** ClientSocket通讯类 **/  public class ClientSocket  {     /**服务器地址*/     private String serverUrl=&q ...

  10. 一:Redis安装

    redis在Linux上的安装 1)安装redis编译的c环境,yum install gcc-c++ 2)将redis-2.6.16.tar.gz上传到Linux系统中 3)解压到/usr/loca ...