Android Paint ANTI_ALIAS_FLAG 引起的一个小问题

本文涉及的产品
交互式建模 PAI-DSW,5000CU*H 3个月
简介: Android Paint ANTI_ALIAS_FLAG 引起的一个小问题

平台


RK3399 + Android 8.1


问题


代码中, 屏幕分辨率为1024x600, 自定义View的尺寸为300x300, 在窗口居中显示.

自定义View绘制的顺序为:


绘制白色背景-Canvas.drawColor

绘制黑色矩形-Canvas.drawRect

绘制红色交叉线, 分别为左上-右下 和 右上-左下 两条

绘制四个角圆, 半径为10个像素

效果图:

image.png

在代码中,增加了左右拖动旋转控件的功能


image.pngimage.png


上图的虚线, 非代码绘制


在没有旋转控件前, 并未出现图中的虚线, 而且虚线还会根据旋转的角度而产生变化, 虚线的颜色会根据自定义View的背景色发生改变.


源码


canvas_test.xml


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/rlRoot"
    android:background="#FF000000"/>


CanvasTest.java


package com.android.test;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.RelativeLayout;
import com.android.test.R;
public class CanvasTest extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.canvas_test);
        RelativeLayout rlRoot = (RelativeLayout)findViewById(R.id.rlRoot);
        CanvasView cv = new CanvasView(this);
        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(300, 300);
        lp.addRule(RelativeLayout.CENTER_IN_PARENT);
        rlRoot.addView(cv, lp);
    }
    class CanvasView extends View {
        Paint p_anti = new Paint(Paint.ANTI_ALIAS_FLAG);
        Paint p_norm = new Paint();
        public CanvasView(Context context) {
            super(context);
        }
        int W, H;
        int CX, CY;
        RectF viewPort = new RectF();
        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            W = w;
            CX = W/2;
            H = h;
            CY = H/2;
            viewPort.set(0, 0, W, H);
        }
        float dx, dy, cx, cy;
        float rotZ = 0;
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            float x = event.getRawX();
            float y = event.getRawY();
            cx = x;
            cy = y;
            switch(event.getAction()){
                case MotionEvent.ACTION_DOWN:
                    dx = x;
                    dy = y;
                    rotZ = getRotation();
                    break;
                case MotionEvent.ACTION_MOVE:
                    float rotate = (dx - cx) / W;
                    setRotation(rotZ + 90f * rotate);
                    break;
            }
            return true;
        }
        @Override
        protected void onDraw(Canvas canvas) {
            Paint p = p_anti;
            canvas.drawColor(Color.WHITE);
            //RECT
            p.setColor(Color.BLACK);
            canvas.drawRect(viewPort, p);
            //LINES
            p.setColor(Color.RED);
            float[] lines = {viewPort.left, viewPort.top, viewPort.right, viewPort.bottom,
                            viewPort.right, viewPort.top, viewPort.left, viewPort.bottom};
            canvas.drawLines(lines, p);
            //CIRCLE
            for(int i = 0; i < lines.length / 2; i ++){
                canvas.drawCircle(lines[i * 2], lines[i * 2 + 1], 10, p);
            }
        }
    }
}


最终发现, 这是由Paint引起的.

在代码中定义了两个Paint

Paint p_anti = new Paint(Paint.ANTI_ALIAS_FLAG);
        Paint p_norm = new Paint();


在onDraw函数中, 使用p_norm并不会出现虚线的问题, 而使用p_anti才会出现.

放大图像:

image.png

相关实践学习
使用PAI-EAS一键部署ChatGLM及LangChain应用
本场景中主要介绍如何使用模型在线服务(PAI-EAS)部署ChatGLM的AI-Web应用以及启动WebUI进行模型推理,并通过LangChain集成自己的业务数据。
机器学习概览及常见算法
机器学习(Machine Learning, ML)是人工智能的核心,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,它是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。 本课程将带你入门机器学习,掌握机器学习的概念和常用的算法。
相关文章
|
前端开发 Android开发 Python
|
前端开发 Android开发 图形学
Android自定义View工具:Paint&Canvas(一)
本文主要讲的是自定义View时我们经常用到的Canvas和Paint,像平时画画一样,我们需要画布和画笔,而Canvas就是画布,Paint就是画笔
|
Android开发
Android Paint 抗锯齿画线模糊
Android Paint 抗锯齿画线模糊
200 0
Android Paint 抗锯齿画线模糊
|
API Android开发
android自定义控件-paint详解
android自定义控件-paint详解
301 0
android自定义控件-paint详解
|
vr&ar Android开发
【Android 应用开发】Paint 图形组合 Xfermod 之 合成模式表示方法 ( Xfermod 使用步骤 | 透明度 颜色值 公式表示方法 | 老版本表示方法 | 合成区域分块 )
【Android 应用开发】Paint 图形组合 Xfermod 之 合成模式表示方法 ( Xfermod 使用步骤 | 透明度 颜色值 公式表示方法 | 老版本表示方法 | 合成区域分块 )
187 0
【Android 应用开发】Paint 图形组合 Xfermod 之 合成模式表示方法 ( Xfermod 使用步骤 | 透明度 颜色值 公式表示方法 | 老版本表示方法 | 合成区域分块 )
|
Android开发 图形学
【Android 应用开发】Paint 图形组合 Xfermod 简介 ( 图形组合集合描述 | Xfermod 简介 | PorterDuff 简介 )
【Android 应用开发】Paint 图形组合 Xfermod 简介 ( 图形组合集合描述 | Xfermod 简介 | PorterDuff 简介 )
141 0
【Android 应用开发】Paint 图形组合 Xfermod 简介 ( 图形组合集合描述 | Xfermod 简介 | PorterDuff 简介 )
|
Android开发
【Android 应用开发】Paint 渲染 之 BitmapShader 位图渲染 ( 渲染流程 | CLAMP 拉伸最后像素 | REPEAT 重复绘制图片 | MIRROR 绘制反向图片 )(二)
【Android 应用开发】Paint 渲染 之 BitmapShader 位图渲染 ( 渲染流程 | CLAMP 拉伸最后像素 | REPEAT 重复绘制图片 | MIRROR 绘制反向图片 )(二)
254 0
【Android 应用开发】Paint 渲染 之 BitmapShader 位图渲染 ( 渲染流程 | CLAMP 拉伸最后像素 | REPEAT 重复绘制图片 | MIRROR 绘制反向图片 )(二)
|
前端开发 Android开发
【Android 应用开发】Paint 渲染 之 BitmapShader 位图渲染 ( 渲染流程 | CLAMP 拉伸最后像素 | REPEAT 重复绘制图片 | MIRROR 绘制反向图片 )(一)
【Android 应用开发】Paint 渲染 之 BitmapShader 位图渲染 ( 渲染流程 | CLAMP 拉伸最后像素 | REPEAT 重复绘制图片 | MIRROR 绘制反向图片 )(一)
367 0

热门文章

最新文章