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

2023-05-16

画板基类继承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();
              }

          });
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android中多线程绘制曲线图实例 的相关文章

  • gradle更新后无法找到方法(无法编译项目)

    我尝试将项目中的 gradle 版本更新为 4 1 milestone 1 以下这些说明 https developer android com studio build gradle plugin 3 0 0 migration html
  • AdapterContextMenuInfo 始终为 null

    我尝试通过 android 开发文档中的书来做到这一点 this didn t create a menu i don t know why registerForContextMenu getListView setListAdapter
  • 如何正确释放Android MediaPlayer

    我正在尝试向我的 Android 应用程序添加一个按钮 当点击该按钮时它会播放 MP3 我已经让它工作了 但没有办法释放 mediaPlayer 对象 因此即使在我离开活动后它仍然会继续播放 如果我在react 方法之外初始化MediaPl
  • 如何使用 Google Maps for Android V2 处理地图移动结束?

    我想在地图中心更改后立即对地址进行地理编码 如何使用新的 Android 版 Google 地图 V2 处理地图移动 我说的是用户用手指拖动地图的情况 查看新的地图 API Override public void onMapReady G
  • Android WebView里面的ScrollView只滚动scrollview

    在我的应用程序中 我有一个 ScrollView 其中包含一些线性视图 一些文本视图和一个 Webview 然后是其他线性布局等 问题是 WebView 不滚动 Scroll 仅侦听 ScrollView 有什么建议么
  • Android应用程序组件销毁和重新创建的详细信息

    有人可以向我提供一些具体的 值得信赖的 最好是简洁的 信息 内容如下 系统销毁和 如果适用 重新创建组件的顺序 片段 活动 活动的线程 异步任务 计时器 静态数据 类何时卸载 其他类中的线程 异步任务 定时器 主机 TabActivity
  • Bitmap.getPixels() 中的 IllegalArgumentException

    我想将数据从位图复制到int using getPixels 这是我当前的代码 int pixels new int myBitmap getHeight myBitmap getWidth myBitmap getPixels pixel
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • 使用片段时应用程序崩溃

    我正在处理碎片和 我的代码中有一个我找不到的问题 logcat 指向我的一个片段中的这段代码 Override public View onCreateView LayoutInflater inflater ViewGroup conta
  • Android 构建发布失败,原因为:java.lang.ArrayIndexOutOfBoundsException:213(pr​​oguard 问题)

    我的项目使用调试构建变体构建得很好 但使用发布变体 Android Studio 会抛出 引起原因 java lang ArrayIndexOutOfBoundsException 213 可能是什么问题 如果我设置minifyEnable
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • WorkManager 或 AlarmManager 用于日常请求然后通知工作?

    这是用例 用户设置具有特定时间的每日通知 在指定时间 发出网络请求以获取一些数据 然后使用检索到的数据显示通知 我不确定是否应该使用 AlarmManager 还是 WorkManager 来实现这个用例 据我了解 AlarmManager
  • Dagger 2 没有生成我的组件类

    我正在使用 Dagger 2 创建我的依赖注入 几个小时前它还在工作 但现在不再生成组件 这是我创建组件的地方 public class App extends Application CacheComponent mCacheCompon
  • Android 中的处理程序与异步调用

    目前我正在使用处理程序来调用 Web 服务方法以使其在后台运行 问题是它需要更多的时间来给出响应 在性能方面似乎更昂贵 现在我计划使用异步调用 哪一个是最好的 Android 中的处理程序和异步调用有什么区别 请帮我想出一个最好的解决方案
  • 卡片视图 单击卡片移至新活动

    我是 Android 编程新手 正在研究卡片布局 我想知道如何使其可点击 android clickable true android foreground android attr selectableItemBackground 我的卡
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 通过电子邮件发送文本文件附件

    我正在尝试附加一个文本文件以便通过电子邮件发送 但每当我打开电子邮件应用程序时 它都会说该文件不存在 请帮助 Intent i new Intent Intent ACTION SEND i setType text plain i put
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • 如何使用 AccessibilityService 在 Android 中模拟按键

    我正在编写一个辅助服务 我一直在尝试在应用程序上进行一些自动搜索 我使用accessibilityservice action paste来填充EditText 然后我需要模拟软键盘上的按键 但我不知道如何做 你们能帮我一下吗 你可以尝试A
  • Android 后台倒计时器

    我有一个 Android 应用程序 它管理一个倒计时器 类 CountDownTimer 它显示在应用程序屏幕中 以显示到达 00 00 还剩多少时间 我现在的问题是 当我按主页按钮或启动另一个应用程序时 应用程序 计时器不会在后台运行 所

随机推荐

  • Android USB 开发详解

    Android USB 开发详解 先附上 Android USB 官方文档 Android通过两种模式支持各种 USB 外设和 Android USB 附件 xff08 实现Android附件协议的硬件 xff09 xff1a USB附件和
  • Android USB串口开发

    因为第一次接触Android下的串口开发 xff0c 在网上找了很多例子都不能满足自己的需要以及不能正常使用 xff0c 于是结合网上的资源以及查阅资料 xff0c 终于完成了关于这个串口的开发 xff0c 在此记录下usb转串口通信开发的
  • Android USB转串口通信开发实例详解

    好久没有写文章了 xff0c 年前公司新开了一个项目 xff0c 是和usb转串口通信相关的 xff0c 需求是用安卓平板通过usb转接后与好几个外设进行通信 xff0c 一直忙到最近 xff0c 才慢慢闲下来 xff0c 趁着这个周末不忙
  • Android USB转串口编程

    安卓手机的对外通信接口就只有USB跟音频口 xff0c 我们可采用其进行与外设进行通信 今天 xff0c 我们来讲讲安卓手机利用USB接口与外设进行通信 此时 xff0c 有两种情况 第一 xff1a USB xff08 手机 xff09
  • Android串口编程--开关灯Demo(附源码)

    1 项目简述 第二次玩硬件了 xff0c 第一次是通过局域网控制门的开关 xff0c 这次是通过ZB xff08 大概就是这么叫 xff0c 具体名字不清楚 xff09 控制灯的开关 xff0c 感觉控制硬件也就是给硬件发个byte数组而已
  • 安卓开发中的USB转串口通讯

    安卓开发中的USB转串口通讯 本文使用GitHub上开源的 hoho android usbserial USB串口库 该库基于 Android USB Host API xff0c 驱动完全由java开发 xff0c 无需root xff
  • Android USB转串口开发(hoho.android.usbserial串口库)

    使用hoho android usbserial串口库开发串口 import android app Application import android app PendingIntent import android content B
  • 安卓数据库开发helper

    package com mytest myapplication public class MyInfo public MyInfo int id String name String value ID 61 id Name 61 name
  • Android 在布局容器中动态添加控件

    这里 xff0c 通过一个小demo xff0c 就可以掌握在布局容器中动态添加控件 xff0c 以动态添加Button控件为例 xff0c 添加其他控件同样道理 1 addView 添加控件到布局容器 2 removeView 在布局容器
  • delphi offsetof , container_of 通过结构体成员获得到该结构体地址

    C宏 offsetof type member 该结构体成员相对于该结构体的偏移量 define offsetof TYPE MEMBER size t amp TYPE 0 gt MEMBER 那Delphi版的表示式怎么写呢 Nativ
  • Android 动态添加Button(1)

    这是一个非常简单的动态添加Button的例子 xff1a package com kkkk llll import android app Activity import android os Bundle import android w
  • 将一串随机数输入到二维坐标轴中,不断刷新JPanel,实现动态显示的效果微笑

    将一串随机数输入到二维坐标轴中 xff0c 不断刷新JPanel 实现动态显示的效果 import java awt BasicStroke import java awt BorderLayout import java awt Colo
  • onDraw什么时候被调用?

    1 onDraw是在View初化完成之后开始调用 2 postInvalidate 是重绘的 xff0c 也就是调用postInvalidate 后系统会重新调用onDraw方法画一次 onDraw实例 xff1a Java code 64
  • Android 动态绘制曲线等各种图形

    Android 中动态的绘制有两种方法 xff0c 一种是用OpenGL ES xff0c 它主要用来做3D图形开发 xff0c 对于一般的应用 xff0c 我们会采取自定义一个View xff0c 然后覆盖onDraw 的方法 xff0c
  • Android 曲线图绘制

    最近项目里要做一个简单的曲线图来标识数据 xff0c 开始以为很简单 xff0c android已经有那么多的开源图表库了 xff0c 什么achartenginee hellochart xff0c mpandroidchart等等 xf
  • android中在代码中动态布按钮和画板局并绘制曲线

    strong 绘图面板基类继承View strong package com mytest myapplication Utility import android graphics Color import android util Lo
  • html5 div布局与table布局

    div布局 xff1a html 43 css实现简单布局 container中height不能写成百分数 xff0c 必须为具体高度 lt DOCTYPE html gt lt html gt lt head lang 61 34 en
  • andorid程序UI线程下开启子线程闪退错误解决

    android view ViewRootImpl CalledFromWrongThreadException Only the original 运行时报 android view ViewRootImpl CalledFromWron
  • Android子线程更新UI的方法总结

    消息机制 xff0c 对于Android开发者来说 xff0c 应该是非常熟悉 对于处理有着大量交互的场景 xff0c 采用消息机制 xff0c 是再好不过了 有些特殊的场景 xff0c 比如我们都知道 xff0c 在Android开发中
  • android中多线程绘制曲线图实例

    画板基类继承view package com mytest myapplication Utility import android graphics Color import android util Log import android