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. 最近总想着写一个模拟alert和confirm插件,代替原生的

    msgbox-confirm github:  https://github.com/tong-mikasa/msgbox-confirm 主要js代码,scss代码 (function($) { $ ...

  2. linux curl post/put请求

    案列: -X: 请求方式 --header: 请求header -d: 请求的数据 最后跟上请求的地址 curl -X PUT --header 'Content-Type: application/ ...

  3. mysql 02

    CREATE TABLE emp(eid INT,ename VARCHAR(20),egender CHAR(2),ebirthday DATE,eemail CHAR(10),eramark VA ...

  4. ionic3 pop到指定页面

    this.navCtrl.getViews().forEach(element => { if(element.name == 'JiecheHomePage'){ this.navCtrl.p ...

  5. inline元素、inline-block元素在float、position:fixed、position:absolute之后出现的问题

    我们知道内联元素是不能设置宽.高的,但是一旦使其脱离了文档流,就可以了,这是因为它已经变成了块级元素. 例1: <!DOCTYPE html> <html lang="en ...

  6. 给你的移动网站加点料:推荐下载App,如果本地安装则直接打开本地App(Android/IOS)

    纵观现在每家移动网站,打开首页的时候,都有各种各样的形式来提示你下载自身的移动App(Android/IOS),这是做移动客户端产品的一个很好地引流的手段.当然各家引流下载的交互和视觉各不相同,有的是 ...

  7. elasticsearch 初步

    本文主要内容: 1.elasticsearch的认识(是个啥,能干啥) 2.安装启动.简单集群及关键配置 3.名词解释 4.存取数据,中文分词 ---------------------------- ...

  8. lucene关于IndexReader总结

    IndexReader.使用过程中有时会出现document被删除,reader还是原来的reader没有改变,所以使用openifchanged保证, 又因为IndexReader 初始化很耗费资源 ...

  9. PyCharm鼠标右键不显示Run unittest方法

    PyCharm鼠标右键不显示Run unittest方法 PyCharm是一个用来写python代码的IDE,很好用.在其中建立了unittest类后,鼠标点击某个test方法后,菜单中会显示Run ...

  10. Learning Linux Commands: awk--reference

    http://how-to.linuxcareer.com/learning-linux-commands-awk 1. Introduction In this case, the title mi ...