ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

关于不同API的Android绘图问题

2019-06-29 12:11:06  阅读:197  来源: 互联网

标签:android paint android-canvas


我在使用Paint for Android的不同API时遇到了问题.

用户应该能够在一个区域上绘制字母,这在API 8和10上工作正常,但对于API 16和17,这些线条看起来非常不同.我将展示使用图像.

这就是它应该看起来的样子,API 8.

这就是API 16的样子.

这是我的绘图视图代码:

public class TouchDrawView extends View
{
    private Paint mPaint;
    private ArrayList<Point> mPoints;
    private ArrayList<ArrayList<Point>> mStrokes;

    public TouchDrawView(Context context)
    {
        super(context);

        mPoints = new ArrayList<Point>();
        mStrokes = new ArrayList<ArrayList<Point>>();
        mPaint = createPaint(Color.BLACK, 14);
    }

    @Override
    public void onDraw(Canvas c)
    {
        super.onDraw(c);

        for(ArrayList<Point> points: mStrokes)
        {
            drawStroke(points, c);
        }

        drawStroke(mPoints, c);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
        if(event.getActionMasked() == MotionEvent.ACTION_MOVE)
        {
            mPoints.add(new Point((int) event.getX(), (int) event.getY()));

            this.invalidate();
        }

        if(event.getActionMasked() == MotionEvent.ACTION_UP)
        {
            mStrokes.add(mPoints);
            mPoints = new ArrayList();
        }

        return true;
    }

    private void drawStroke(ArrayList stroke, Canvas c)
    {
        if (stroke.size() > 0)
        {
            Point p0 = (Point)stroke.get(0);

            for (int i = 1; i < stroke.size(); i++)
            {
                Point p1 = (Point)stroke.get(i);
                c.drawLine(p0.x, p0.y, p1.x, p1.y, mPaint);
                p0 = p1;
            }
        }
    }

    public void clear()
    {
        mPoints.clear();
        mStrokes.clear();

        this.invalidate();
    }

    private Paint createPaint(int color, float width)
    {
        Paint temp = new Paint();
        temp.setStyle(Paint.Style.FILL_AND_STROKE);
        temp.setAntiAlias(true);
        temp.setColor(color);
        temp.setStrokeWidth(width);
        temp.setStrokeCap(Paint.Cap.ROUND);

        return temp;
    }
}

解决方法:

好吧,看起来你的应用程序是硬件加速的,在这种模式下,不支持setStrokeCap()(对于行)等一些功能,看看:http://developer.android.com/guide/topics/graphics/hardware-accel.html#unsupported

只需禁用硬件加速,然后重试.这是你如何禁用它:

<application android:hardwareAccelerated="false" ...>

标签:android,paint,android-canvas
来源: https://codeday.me/bug/20190629/1326030.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有