zoukankan      html  css  js  c++  java
  • 记录code修改

    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();
    }

    }
  • 相关阅读:
    SpringBoot启动里的细节问题
    SpringBoot运行过程从SpringApplication开始解读
    SpringBoot应用启动流程
    SpringBoot上传相关配置
    planUML时序图
    JAVA设计模式--单例模式
    中国云运营商横向对比——IaaS服务对标
    ansible api2.0 多进程执行不同的playbook
    自动化运维平台搭建
    django-将数据库数据转换成JSON格式(ORM和SQL两种情况)
  • 原文地址:https://www.cnblogs.com/wcLT/p/7906939.html
Copyright © 2011-2022 走看看