Android动态渐变绘图

时间:2017-06-12 12:34:49

标签: android android-canvas android-bitmap radial-gradients

请参阅附件中的图片。

我想在汽车周围的蓝色力场边缘画一个渐变,如下图所示。

问题是渐变可能出现在蓝色方块的任何边缘(取决于用户输入),并且必须朝向中心。此外,边缘上的小部分也可能只有梯度。

我尝试了几种不同的方法,但却找不到合适的解决方案 目前我正在使用xml中定义的渐变,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<shape 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient android:type="radial" android:gradientRadius="75"
        android:startColor="@color/warningColor"
        android:endColor="#00d8345a"/>
</shape>  

然后在java中使用它并使用SurfaceView画布上的位图绘制它:

Drawable drawable = ResourcesCompat.getDrawable(getResources(), R.drawable.circle_gradient, null);
mGradientBmp = Bitmap.createBitmap(250, 250, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(mGradientBmp);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);

当前通过触摸输入接收应用程序的输入,用户可以触摸屏幕上的任何位置。我在event.getAction == MotionEvent.ACTION_MOVE时保留了所有触摸点的列表,并在每个位置绘制上面的位图,如下所示:

public void drawScreen(Canvas canvas) {

        long c = System.currentTimeMillis();
        canvas.drawColor(Color.WHITE);
        canvas.setMatrix(mPerspectiveMatrix);
        canvas.drawBitmap(mRoadBmp, 0,0, null);
        canvas.drawBitmap(mForceFieldBmp, null, mForceFieldRect, null);

        synchronized (mTouchPointsList) {
            for (PointF p : mTouchPointsList) {
                canvas.drawBitmap(mGradientBmp, p.x, p.y, null);
            }
        }
}

我有几个问题。

您如何建议绘制渐变(仅在蓝色力场的边缘附近)并保持渐变朝向中心?

如何有效地跟踪触摸点?我目前正在使用CopyOnWriteArrayList因为输入和绘图在不同的线程上。

我当前的解决方案几乎可以工作(除了因为列表效率低,所以它会在一段时间后变慢)但绘图需要限制在内部蓝色力场。

如何处理此问题的任何建议将不胜感激。

由于

Gradient in question Antoher sample

0 个答案:

没有答案
相关问题