Android:canvas.drawBitmap() 方法无法正常工作

2024-05-15

我已经发布了两个与此相关的问题(请参考此自定义饼图 1 https://stackoverflow.com/questions/28343600/customize-pie-chart-in-quarter-shape-at-the-bottom-left-of-the-screen-in-android和这个自定义饼图2 https://stackoverflow.com/questions/28404656/pie-chart-in-android-without-third-party-in-android)但没有得到答案,最后我开发了自己的但在某些时候陷入困境。

我需要在绘制区域之间创建线条,如图所示。对于我使用的内圆canvas.drawArc().对于我使用的外圆canvas.drawCircle()对于我使用的中间线canvas.drawBitmap()不同角度的方法。这里正确绘制了内圆和外圆,但对于中间圆弧,只有前两个位图/圆弧被正确绘制,但其余两个未处于准确位置。

我使用相同的代码来绘制所有位图/弧,但没有得到准确的输出。我陷入困境,确切的问题是什么。需要帮助,提前致谢。

你可以看到我的输出

here.. screenshot

听到的是我的onCreate(),其中我生成并设置 view 。

 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv1 = (LinearLayout) findViewById(R.id.linear);     
        matrix = new Matrix();  
        MyView myview = new MyView(this);
        lv1.addView(myview);
    }

这是我的自定义视图类我想要生成的。

    public class MyView extends View {

    private Paint p ,paint,paint_text;
    private int startX;
    private int startY;
    private int radius;
    private ArrayList<Integer> colors;
    private ArrayList<Float> values;
    Bitmap bitmap;
    Context mContext;
    RectF rectF , rectF2 ;
    public MyView(Context context) {
        super(context);
        mContext = context;
        p = new Paint();
        p.setAntiAlias(true);

        colors = new ArrayList<Integer>();
        values = new ArrayList<Float>();

        Display display = getWindowManager().getDefaultDisplay(); 
        width1 = display.getWidth();
        height1 = display.getHeight();      

        startX = 0 ;
        startY = 0;
        radius = (int) (width1/2);             

        colors.add(Color.RED);
        colors.add(Color.BLUE);
        colors.add(Color.YELLOW);
        colors.add(Color.GREEN);            
        values.add(8f);
        values.add(2f); 
        values.add(4f);         
        values.add(2f);         
    }

这是我的onDraw()方法 。

protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);           
        float _angle1 = 0 ,_angle2  = 0 ,_angle3 = 0 , _angle4 =0;      

        Bitmap myBitmap1 = BitmapFactory.decodeResource(getResources(),R.drawable.saperate_line);           
        bitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888);

        Canvas c = new Canvas(bitmap);

        float offset = 0;       
        float angle = (float) 5.60 ;            
        matrix.reset();
        canvas.translate(0,canvas.getHeight()); //reset where 0,0 is located
        canvas.scale(1,-1); // for scaling 

        rectF = new RectF();
        rectF.set(-(getStartX() + getRadius()), -(getStartY() + getRadius()), getStartX() + getRadius(),getStartY() + getRadius());

       //for creating outer circle using canvas.drawCircle-----------
        paint = new Paint();
        paint.setColor(Color.GREEN);        
        paint.setStrokeWidth(2);            
        paint.setStyle(Paint.Style.STROKE);         
        canvas.drawCircle(0, 0, (float) (width1/(1.4)), paint); 

       //for creating inner circle using canvas.drawArc-----------
        for (int i = 0; i < values.size(); i++) {
             p.setColor(colors.get(i));

            if (i == 0) {                   
             canvas.drawArc(rectF, offset, values.get(i) * angle, true, p);   
             _angle1 = ((offset+(values.get(i) * angle)))/2;                    
             matrix.postRotate(_angle1);    
             canvas.drawBitmap(myBitmap1, matrix, null);          

            } 

           if(i == 1){              
              canvas.drawArc(rectF, offset, values.get(i) * angle, true, p);                
              _angle2 = ((offset + (values.get(i) * angle)))/2;
              matrix.postRotate(_angle2);
               canvas.drawBitmap(myBitmap1, matrix, null);
             }  

           if(i == 2){
            canvas.drawArc(rectF, offset, values.get(i) * angle, true, p);          
            _angle3 = ((offset + (values.get(i) * angle)))/2;

            // _angle3 = (offset + angle);                  
             matrix.postRotate(_angle3);
             canvas.drawBitmap(myBitmap1, matrix, null);        
              } 

           if (i == 3){                                     
             canvas.drawArc(rectF, offset, values.get(i) * angle, true, p); 
             _angle4 = ((offset + (values.get(i) * angle)))/2;                
             matrix.postRotate(_angle4);                    
             canvas.drawBitmap(myBitmap1, matrix, null);
                }                        

            offset += (values.get(i) * angle);
            Log.e("new offset :: ","****************************"+offset);

        }
       canvas.save();    

    }

谢谢大家。 最后我用替换这个东西做到了在画布上旋转图像 https://stackoverflow.com/questions/8712652/rotating-image-on-a-canvas-in-android

 matrix.postRotate(_angle1);    
 canvas.drawBitmap(myBitmap1, matrix, null);

有了这个

Matrix matrix1 = new Matrix();
matrix1.setRotate(_angle1, 0, 0);
canvas.drawBitmap(myBitmap1, matrix1, null);

在这里,首先您应该像这样更改值,

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

Android:canvas.drawBitmap() 方法无法正常工作 的相关文章

  • Android 卷页动画

    我对 Android 动画有点陌生 目前我正在开发一个故事活动 需要像 iPhone 中那样使用卷页动画 我发现 iPhone 中有一种方法可以做到这一点 但我仍然找不到在android中做的方法 所以请帮我解决这个问题 谢谢大家 谷歌代码
  • 如何在Android 4.2中更改Action Bar选项菜单的背景颜色?

    我想更改 Android 4 2 中选项 溢出 菜单的背景颜色 我已经尝试了所有方法 但它仍然显示主题设置的默认颜色 我使用了以下代码和 XML 配置 MainActivity java public class MainActivity
  • PopupWindow onitemclick 中的 Android Listview 在某些设备上不起作用

    我的 ListView 在 PopupWindow 内 当我显示 PopupWindow 并单击设备 ASUS K00z 中的 Listview 行时 fonepad 工作得很好 但在 HTC Z715e 中不起作用 项目单击事件未触发 1
  • ViewFlipper中的VideoView在播放视频时是透明的

    我有一个 Activity 在 ViewFlipper 中设置了两个视图 其中一个视图是带有 GLSurfaceView 和一些其他小部件的布局 另一个视图只有带有 TextView 和 VideoView 的布局 当我单击 GLSurfa
  • Twowayview 滚动时自动添加内边距

    我在用双向视图 https github com lucasr twoway view在我的一个项目中 这是android的扩展回收者视图 https developer android com reference android supp
  • 如何将Android中的cURL发送到REST服务

    我是 android 新手 我想从 REST 服务获取一些数据 但在初始化发送到 REST 服务的方法时遇到一些问题 您知道 REST 服务使用 cURL 来操作一些数据 POST PUT GET DELETE 现在如何在 android
  • Android SQLite 从代码中转储数据库以进行错误报告

    我正在为我的一个 Android 程序开发一种诊断工具 本质上 如果用户遇到问题 我想做一些类似 SQLite 的事情dump 参考 http www sqlite org sqlite html http www sqlite org s
  • Android 片段之间的阴影分隔符

    我有一个类似于平板电脑的 ICS Gmail 应用程序的布局 ListFragment左边是内容 右边是内容 我想知道如何构建布局 使两个片段之间有一个阴影分隔符 就像在 Gmail 应用程序中一样 如下所示 另外 由于这适用于这个问题 我
  • 使用Picasso从url保存图像?

    我正在尝试使用 API Picasso 保存图像 为了做到这一点 我正在尝试使用Target保存 但我无法完成这项工作 我怎么能这样做呢 Trying save image public static void imageDownload
  • 如何在Android中访问现有的sqlite数据库?

    到目前为止 我们已经在 Android 中开发了在运行时创建数据库的应用程序 我们想知道如何在 Android 应用程序中访问预构建或现有的数据库 sqlite 文件 请提供详细信息 查看文档android database sqlite
  • 地理编码 API 与地理编码器

    在我的应用程序中 我需要使用地理编码 但我不太清楚该使用哪种方法 直到昨天我在URL中添加了参数maps googleapis com maps api geocode json address myparameter sensor fal
  • Android ViewModel LiveData 在按钮单击时更新视图

    我正在关注这个tutorial https developer android com topic libraries architecture guide html common problems faced by app develop
  • java.net.ProtocolException:流意外结束

    我面临一个奇怪的问题 并且无法调试它 我已经实现了上传数据流的逻辑 并使用 Volley 来实现相同的功能 我在HurlStack addBodyIfExistsapi 以便可以处理 application octet stream 类型的
  • Flutter - 删除 ListView 中项目之间的空间

    我正在使用 ListView builder 函数来创建项目列表 然而 iOS 中每个项目之间的空间很大 截图 你知道如何删除项目吗 看来是默认的 因为我没有添加它 code 列表显示 return Scaffold body ListVi
  • 如何使用 MotionLayout 调整 TextView 的大小

    我正在尝试创建一个CollapsingToolbar动画使用MotionLayout 我已经成功地将所有内容设置为动画 使其表现得像CollapsingToolbar具有高度的灵活性 这意味着我可以轻松创建很棒的动画 而无需编写大量代码 我
  • 调整 SwipeRefreshLayout 高度,将 View 置于其底部

    I have SwipeRefreshLayout里面一个RelativeLayout 问题是SwipeRefreshLayout占据了屏幕上的所有位置 我需要放置一个视图after这个观点 看图片 https i stack imgur
  • 如何从一个活动检索 Double 值到另一活动?

    我制作了一个包含 2 个活动的应用程序 其中第一个活动包含一些 EditText 十进制数字 另一个活动也包含一些 EditText 十进制 现在我想将一个 EditText 的值传递给另一个 但作为 双 而不是作为一个字符串 因为该值将用
  • android 中的 java.net.URL ..新手问题

    我是java新手 正在尝试android开发 以下代码生成 malformedURLException 有人可以帮助我识别异常吗 任何提示都会非常有帮助 package com example helloandroid import and
  • 如何解决android程序中的警告“从不本地读取”

    为什么我收到警告说 The field testscreen ScaleAnimToShow mVanishAfter is never read locally testscreen java testscreen src com tes
  • 应用程序关闭时单击 Firebase 通知后打开特定活动/片段

    我知道这个问题似乎重复 但根据我的要求 我在网上搜索了很多帖子 但没有任何对我有用 我的要求 我正在使用 Firebase 来获取推送通知 当应用程序打开时意味着一切正常 但我的问题是 如果有任何推送通知出现 应用程序处于后台 关闭意味着我

随机推荐

  • 如何在 Haskell 中漂亮地打印表格?

    我想在 Haskell 中漂亮地打印一个类似表格的数据结构 列列表 例如 Table StrCol strings a bc c IntCol ints 1 30 2 DblCol doubles 2 0 4 5 3 2 应该渲染类似 st
  • 在实体框架拦截器中向 DbScanExpression 添加内部联接

    我正在尝试使用实体框架 CommandTree 拦截器通过 DbContext 向每个查询添加过滤器 为了简单起见 我有两个表 一个称为 User 有两列 UserId 和 EmailAddress 另一个称为 TenantUser 有两列
  • 变量前面加双下划线

    我的节点代码中有以下代码片段 var fs require fs fs readdir dirname function err files console log files 为什么变量 dirname 有双下划线 我知道一个下划线是私有
  • 在 C# 中按元素相乘数组具有意想不到的性能

    我想找到按元素相乘两个数组的最佳方法 这是更广泛项目的一部分 其中性能而不是唯一的考虑因素 我今天开始用 C Linqpad 编写一些函数 因此它还没有以任何方式进行优化 下面代码的输出如下 Environment ProcessorCou
  • 语法:const {} = 变量名,任何人都可以解释或指出我正确的方向[重复]

    这个问题在这里已经有答案了 这个语法在 JavaScript 中意味着什么 可能是 ES6 const 变量名 我目前正在尝试掌握 React 在很多例子中我都遇到过这种语法 例如 const girls guys women men st
  • 使用数据库进行日志记录

    大多数日志似乎都是纯文本形式 而不是放入 MySQL 其他类型的数据库中 这是否有原因 在我看来 将它们放入数据库将使分析变得非常非常容易 但这会以牺牲速度还是其他什么为代价 我不太关心可移植性 显然你会有数据库连接的文本日志 我能想到两大
  • IE8 和 9 上的 socket.io 问题

    Socket io 在除 IE8 和 9 之外的所有平台上都能完美运行 这是客户端要求 你们能帮忙解决这个问题吗 我一直在阅读所有类似的问题 但到目前为止我发现的大多数解决方案都无法解决 IE8 上的这个问题 这是结构 服务器端 var i
  • IN 子查询中的 GROUP_CONCAT

    SELECT A id A title FROM table as A WHERE A active 1 AND A id IN SELECT GROUP CONCAT B id from B where user 3 如果我启动子查询SE
  • colorForth /mod 算法如何工作?

    我一直在看查克 摩尔 https en wikipedia org wiki Charles H Moore s 彩色前 https en wikipedia org wiki ColorForth最近 我发现了这段代码 以传统语法呈现 m
  • 在 mac 终端中加载库时出错

    有谁请帮忙 我该如何修复以下错误 dyld Library not loaded usr local lib libgdbm 4 dylib Referenced from usr local bin zsh Reason image no
  • AWS SNS 端点自行禁用

    我已将 Android 和 iOS 应用程序设置为能够通过 SNS 接收通知 设置工作正常 设备确实收到了通知 但后来 通知开始失败 我已经启用了成功和失败场景的日志记录 根据日志 我不断收到以下形式的错误 端点已禁用 arn aws sn
  • php无法在docker-compose中连接到mysql

    这是我的 docker compose version 2 services nginx image nginx 1 11 8 alpine ports 8081 80 volumes code usr share nginx html h
  • 在 Serverless Framework 1.0 中使用路径参数

    我想使用路径参数 customer customerId of a GET请求以使用 AWS Lambda 查询客户 functions createCustomer handler handler createCustomer event
  • 如何在spring mvc框架中运行后台进程

    我有一个网络应用程序 使用 spring mvc 框架 它使得以下内容 用户将文件上传到服务器 立即进入成功页面 使用该文件运行后台进程 那么 我如何使用 spring mvc 框架来做到这一点呢 先感谢您 使用异步标记方法 你在这里有例子
  • 这个 SQL 查询有什么问题?

    在过去的一个小时里 我一直在尝试此查询的不同变体 但我在用户名处收到错误 并且用户名只是一个普通字符串 其中的用户名是我从不包含特殊字符或任何内容的 xml 文件中获取的 我正在使用 SLQ 紧凑型 3 5 P S 我尝试使用 而不是 us
  • getElementsByClassName & IE8:对象不支持此属性或方法[重复]

    这个问题在这里已经有答案了 I know getElementsByClassName 不支持IE8 你知道我可以用什么来代替吗 我因错误而变得烦人 对象不支持此属性或方法 HTML 代码是 function sumar var elems
  • 如何保证对象只有一个线程

    我有以下代码 class Service public void start creates thread which creates window and goes to message loop void stop sends WM C
  • 我如何理解这个 C 类型声明?

    double bar int double double double double 在查看讲座幻灯片时 我发现了留给学生的练习 用简单的英语来说 什么是类型bar在这个 C 声明中 Please帮助我解决这个问题 我什至不知道从哪里开始
  • 使用 pandas 将字符串对象转换为 int/float

    import pandas as pd path1 home supertramp Desktop 100 life 180 data csv mydf pd read csv path1 numcigar Never 0 1 5 Ciga
  • Android:canvas.drawBitmap() 方法无法正常工作

    我已经发布了两个与此相关的问题 请参考此自定义饼图 1 https stackoverflow com questions 28343600 customize pie chart in quarter shape at the botto