android中多线程绘制曲线图实例

画板基类继承view

package com.mytest.myapplication.Utility;

import android.graphics.Color;
import android.util.Log;
import android.view.View;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.graphics.Point;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.WindowManager;
import android.widget.Button;
import java.lang.Thread;

import java.util.ArrayList;

//自定义简单曲线图
public class MyGraphicView extends View{

    public Context _Context;
    private Paint _mPaint;
    private Paint _mPaint2;
    public String _type="0";


   // private Resources _res;
   // private DisplayMetrics _dm;
    /**
     * 曲线上总点数
     */
    private float[] mPoints={0,0,10,10,20,20,30,30,};
    /**
     * 纵坐标值
     */
    private ArrayList<Double> yRawData;
    /**
     * 横坐标值
     */
    private ArrayList<String> xRawDatas;
    public MyGraphicView(Context context)
    {
        this(context, null);
    }
    public MyGraphicView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        this._Context = context;

        initView();
    }
    private void initView()//初始化
    {
        //this._res = _Context.getResources();
        this._mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        this._mPaint2 = new Paint(Paint.ANTI_ALIAS_FLAG);
       // _dm = new DisplayMetrics();
      //  WindowManager wm = (WindowManager) _Context.getSystemService(Context.WINDOW_SERVICE);
       // wm.getDefaultDisplay().getMetrics(_dm);
    }
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh)//尺寸改变事件
    {
          super.onSizeChanged(w,h,oldw,oldh);
    }
    @Override
    protected void onDraw(Canvas canvas)
    {
        _mPaint.setColor(Color.BLUE);//颜色赋值
        _mPaint2.setColor(Color.RED);//颜色赋值

        if(_type=="0") {
            canvas.drawLine(0, 100, getWidth(), getHeight(), _mPaint);

            // super.onDraw(canvas);
        }
        else
        {
            DrawXYAxis( canvas);//画坐标和曲线
           // canvas.drawLines(mPoints, _mPaint);
        }

    }
    public void Redraw(String type)//重绘触发
    {
        _type=type;
        invalidate();//重绘触发事件
    }
    public void DrawXYAxis(Canvas canvas)//画坐标和曲线
    {
        int allWidth=getWidth();//界面宽度
        int allHeight=getHeight();//界面高度
        canvas.drawLine(50,50,(float)(50),(float)(allHeight-50),_mPaint2);//画y轴
        canvas.drawLine((float)(50),(float)(allHeight-50),(float)(allWidth-50),(float)(allHeight-50),_mPaint2);//画x轴


        float[] xPoints=new float[allWidth];
        float[] yPoints=new float[allWidth];
        for(int i=0;i<allWidth;i++)
        {
            xPoints[i]=i;
            yPoints[i]=(float)(Math.random()*400);
        }
        canvas.drawText("测试曲线",(float)(allWidth/2.0),20, _mPaint);//画标题
        for(int i=10;i<allWidth;i++)//画横轴刻度
        {
            if(i%50==0)
            {
                canvas.drawText(String.valueOf(i),i,allHeight-30, _mPaint);
            }
        }
        for(int i=allHeight-10;i>50;i-=50)//画纵轴刻度
        {
          try {
              canvas.drawText(String.valueOf(allHeight-10-i),20,i, _mPaint);
          }
          catch (Exception e)
          {
            Log.i("异常:",e.toString());
          }


        }
        for(int i=0;i<allWidth-2;i++)//画曲线
        {

            canvas.drawLine(xPoints[i]+50,allHeight-210-yPoints[i],xPoints[i+1]+50,allHeight-210-yPoints[i+1], _mPaint);
        }



    }
  public  MyThread _Th=null;
    public class MyThread extends Thread{
        public Thread th;
        public String thName;
      public MyThread(String name)
        {
          thName=name;
        }
        public void run()
        {
          try {
              Thread.sleep(1000);
              run2();
          }
          catch (Exception e)
          {
              Log.i("线程异常",e.toString());
          }
        }
        public void run2()
        {
            new Thread(new Runnable() {
                @Override
                public void run() {
                  Redraw("1");
                }
            }).start();

        }
        public void start()
        {
          if(th==null)
          {
             th= new Thread(this,thName);
            th.start();

          }
        }
        public void Fstop()
        {
          if(th!=null)
          {
              th.interrupt();
              th.stop();
              th=null;
          }
        }


    }


}

绘图显示操作活动页(动态加载按钮和画板view:graphicView)

package com.mytest.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TableLayout;

import com.mytest.myapplication.Utility.MyGraphicView;

public class MyDrawActivity extends AppCompatActivity {
    MyGraphicView graphicView;
    public Button button1;
    public Button button2;
    public Button button3;
    public EditText editText1;
    public Boolean draEnable=false;
    public int displayTime=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DisplayMetrics metric = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metric);
        int width = metric.widthPixels;     // 屏幕宽度(像素)
        int height = metric.heightPixels;   // 屏幕高度(像素)
        float density = metric.density;      // 屏幕密度(0.75 / 1.0 / 1.5)
        int densityDpi = metric.densityDpi;  // 屏幕密度DPI(120 / 160 / 240)
        //final LinearLayout layout = new LinearLayout(this);
        final TableLayout layout=new TableLayout(this);
        graphicView=new MyGraphicView(this,null);
        button1=new Button(this);
        button2=new Button(this);
        button3=new Button(this);
        editText1=new EditText(this);
        button1.setText("对角线");
        button2.setText("开始");
        button3.setText("结束");
        editText1.setText("1000");
        button1.setWidth(width);
        button2.setWidth(width);
        button3.setWidth(width);
        editText1.setWidth(width);
        layout.addView(button1);
        layout.addView(button2);
        layout.addView(button3);
        layout.addView(editText1);
        layout.addView(graphicView);
        setContentView(layout);
        button1.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {

                graphicView. Redraw("0");//重绘触发
            }
        });
       /* button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(graphicView._Th==null)
                {
                    graphicView._Th=  graphicView.new MyThread("绘图线程");

                }

               graphicView._Th.start();
              //  graphicView. Redraw("1");//重绘触发
            }
        });*/
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 displayTime=Integer.valueOf(editText1.getText().toString());

                draEnable=true;
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        while(true) {
                            if(!draEnable)return;
                            try {
                                Thread.sleep(displayTime);
                            } catch (Exception e) {

                            }

                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    graphicView.Redraw("1");//重绘触发
                                }
                            });
                        }
                    }
                }).start();
            }
        });
          button3.setOnClickListener(new View.OnClickListener(){

              public void onClick(View v)
              {
                  draEnable=false;
                  if(graphicView._Th==null)return;
                  graphicView._Th.Fstop();
              }

          });
    }
}

活动页2(同步问题)

package com.mytest.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TableLayout;

import com.mytest.myapplication.Utility.MyGraphicView;

import java.util.concurrent.Semaphore;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class MyDrawActivity extends AppCompatActivity {
    MyGraphicView graphicView;
    public Button button1;
    public Button button2;
    public Button button3;
    public EditText editText1;
    public Boolean draEnable=false;
    public Boolean lockEnable=false;
    public int displayTime=0;
    Lock lock = new ReentrantLock();
    Semaphore semaphore = new Semaphore(1);
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DisplayMetrics metric = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metric);
        int width = metric.widthPixels;     // 屏幕宽度(像素)
        int height = metric.heightPixels;   // 屏幕高度(像素)
        float density = metric.density;      // 屏幕密度(0.75 / 1.0 / 1.5)
        int densityDpi = metric.densityDpi;  // 屏幕密度DPI(120 / 160 / 240)
        //final LinearLayout layout = new LinearLayout(this);
        final TableLayout layout=new TableLayout(this);
        graphicView=new MyGraphicView(this,null);
        button1=new Button(this);
        button2=new Button(this);
        button3=new Button(this);
        editText1=new EditText(this);
        button1.setText("对角线");
        button2.setText("开始");
        button3.setText("结束");
        editText1.setText("1000");
        button1.setWidth(width);
        button2.setWidth(width);
        button3.setWidth(width);
        editText1.setWidth(width);
        layout.addView(button1);
        layout.addView(button2);
        layout.addView(button3);
        layout.addView(editText1);
        layout.addView(graphicView);
        setContentView(layout);
        button1.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {

                graphicView. Redraw("0");//重绘触发
            }
        });
       /* button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(graphicView._Th==null)
                {
                    graphicView._Th=  graphicView.new MyThread("绘图线程");

                }

               graphicView._Th.start();
              //  graphicView. Redraw("1");//重绘触发
            }
        });*/
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 displayTime=Integer.valueOf(editText1.getText().toString());

                draEnable=true;
                lockEnable=false;
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        while(true) {
                             try{
                            while(lockEnable)
                            {
                                Thread.sleep(1);

                            }
                            lockEnable=true;
                            if (!draEnable) return;
                            try {
                                Thread.sleep(displayTime);
                            } catch (Exception e) {
                        String content=e.toString();
                               // lockEnable=false;
                            }

                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    graphicView.Redraw("1");//重绘触发
                                    lockEnable=false;
                                }
                            });

                        }
                        catch (Exception e)
                        {
                          String content=e.toString();
                            lockEnable=false;
                        }
                        }
                    }
                }).start();
            }
        });
          button3.setOnClickListener(new View.OnClickListener(){

              public void onClick(View v)
              {
                  draEnable=false;
                  if(graphicView._Th==null)return;
                  graphicView._Th.Fstop();
                  semaphore.release();
              }

          });
    }
}

活动页3(同步问题) 

package com.mytest.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TableLayout;

import com.mytest.myapplication.Utility.MyGraphicView;

import java.util.concurrent.Semaphore;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class MyDrawActivity extends AppCompatActivity {
    MyGraphicView graphicView;
    public Button button1;
    public Button button2;
    public Button button3;
    public EditText editText1;
    public Boolean draEnable=false;
    public Boolean lockEnable=false;
    public int displayTime=0;
    Lock lock = new ReentrantLock();
    Semaphore semaphore = new Semaphore(1);
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DisplayMetrics metric = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metric);
        int width = metric.widthPixels;     // 屏幕宽度(像素)
        int height = metric.heightPixels;   // 屏幕高度(像素)
        float density = metric.density;      // 屏幕密度(0.75 / 1.0 / 1.5)
        int densityDpi = metric.densityDpi;  // 屏幕密度DPI(120 / 160 / 240)
        //final LinearLayout layout = new LinearLayout(this);
        final TableLayout layout=new TableLayout(this);
        graphicView=new MyGraphicView(this,null);
        button1=new Button(this);
        button2=new Button(this);
        button3=new Button(this);
        editText1=new EditText(this);
        button1.setText("对角线");
        button2.setText("开始");
        button3.setText("结束");
        editText1.setText("1000");
        button1.setWidth(width);
        button2.setWidth(width);
        button3.setWidth(width);
        editText1.setWidth(width);
        layout.addView(button1);
        layout.addView(button2);
        layout.addView(button3);
        layout.addView(editText1);
        layout.addView(graphicView);
        setContentView(layout);
        button1.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {

                graphicView. Redraw("0");//重绘触发
            }
        });
       /* button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(graphicView._Th==null)
                {
                    graphicView._Th=  graphicView.new MyThread("绘图线程");

                }

               graphicView._Th.start();
              //  graphicView. Redraw("1");//重绘触发
            }
        });*/
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 displayTime=Integer.valueOf(editText1.getText().toString());

                draEnable=true;
                lockEnable=false;
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        while(true) {
                             try{
                            while(lockEnable)
                            {
                                Thread.sleep(1);

                            }
                            lockEnable=true;
                            if (!draEnable) return;
                            try {
                                Thread.sleep(displayTime);
                            } catch (Exception e) {
                        String content=e.toString();
                               // lockEnable=false;
                            }

                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    graphicView.Redraw("1");//重绘触发
                                    lockEnable=false;
                                }
                            });

                        }
                        catch (Exception e)
                        {
                          String content=e.toString();
                            lockEnable=false;
                        }
                        }
                    }
                }).start();
            }
        });
          button3.setOnClickListener(new View.OnClickListener(){

              public void onClick(View v)
              {
                  draEnable=false;
                  if(graphicView._Th==null)return;
                  graphicView._Th.Fstop();
                  semaphore.release();
              }

          });
    }
}

猜你喜欢

转载自blog.csdn.net/u011555996/article/details/86300119
今日推荐