动画标记/地图图钉内的绘画动画?

问题描述

简介:

我使用 Mapbox Sdk 开发了一个停车应用(这是一个非常古老的库)。我在屏幕上有一个离线地图,当用户长按地图时,它会从地图中获取 Lat Long,并根据该 Lat Long 从数据库获取有关该点停车情况的数据。并且该数据应显示为具有不同颜色的圆圈。每种颜色代表一种特定情况(例如停车已关闭、已付费或免费)。为了更好地理解,请查看 this screenshot

我做了什么:

目前我所做的是:我在位图上借助油漆绘制颜色,然后对该位图进行可绘制并将其添加标记中,然后将该标记添加到地图中。然后大头针出现了。

在位图上绘制颜色:

private Bitmap createCustomGauge(Date date,int radius,boolean shouldTransparent,List<MyPeriod> periods) {
        int BLACK = 0xFF000000;
        int WHITE = 0xFFFFFFFF;
        int RED = 0xFFD6263B;
        int BLUE = 0xFF2770A7;
        int GREEN = 0xFF00A260;
        int GRAY = 0xFF939598;
        int TRANSPARENT = 0x1AFFFFFF;
        int BACKGROUND_COLOR = shouldTransparent ? TRANSPARENT : WHITE;
        int gWidth = radius * 2;
        int gHeight = radius * 2;

        Bitmap.Config conf = Bitmap.Config.ARGB_8888;
        Bitmap bitmap = Bitmap.createBitmap(gWidth,gHeight,conf);
        Canvas canvas = new Canvas(bitmap);

        canvas.drawColor(BACKGROUND_COLOR);
        bitmap.setHasAlpha(true);

        Paint p = new Paint();
        p.setAntiAlias(true);
        p.setColor(BLACK);
        p.setStyle(Paint.Style.stroke);
        p.setstrokeWidth(gHeight / 10.5F);

        float left = gWidth / 12.0F;
        float top = gHeight / 12.0F;

        RectF rectF = new RectF(left,top,gWidth - left,gHeight - top);

        //max drawn angle is 180°: 270°-90° = 180° on left side.
        float leftStartAngle = 90;
        final float leftEndAngle = 270;
        //max drawn angle is 180°: 450°-270° = 180° on right side.
        float rightStartAngle = 270;
        final float rightEndAngle = 450;
        final float maxDrawnAngle = 180; // max drawn angle is always 180°

        int leftArrowColor = RED;
        int rightArrowColor = RED;

        if (periods.isEmpty()) {
            p.setColor(RED);
            canvas.drawArc(rectF,rightStartAngle,(rightEndAngle - rightStartAngle),false,p);
            canvas.drawArc(rectF,leftStartAngle,(leftEndAngle - leftStartAngle),p);
        } else {
            for (int i = 0; i < periods.size(); i++) {
                MyPeriod period = periods.get(i);
                int leftColor;
                int rightColor;

                if (period.direction == 0) {
                    leftColor = (period.getParkingType() == 0) ?
                            RED : period.getParkingType() == 1 ? BLUE : GREEN;
                } else {
                    leftColor = RED;
                }

                if (period.direction == 1) {
                    rightColor = (period.getParkingType() == 0) ?
                            RED : period.getParkingType() == 1 ? BLUE : GREEN;
                } else {
                    rightColor = RED;
                }

                if (period.direction == 0) {
                    p.setColor(leftColor);
                    float totalSweepAngle =
                            (float) getDateDifference(period.startDate,period.endDate) * 15;
                    if (leftStartAngle == 90) {
                        leftArrowColor = leftColor;
                        totalSweepAngle = Math.min(totalSweepAngle,maxDrawnAngle);
                        canvas.drawArc(rectF,totalSweepAngle,p);
                        leftStartAngle += totalSweepAngle;
                    } else if (leftStartAngle < leftEndAngle) {
                        totalSweepAngle = Math.min(totalSweepAngle,(leftEndAngle - leftStartAngle));
                        canvas.drawArc(rectF,p);
                        leftStartAngle += totalSweepAngle;
                    }
                }

                if (period.direction == 1) {
                    p.setColor(rightColor);
                    float totalSweepAngle = (float) getDateDifference(period.startDate,period.endDate) * 15;
                    if (rightStartAngle == leftEndAngle) {
                        totalSweepAngle = Math.min(totalSweepAngle,maxDrawnAngle);
                        rightArrowColor = rightColor;
                        canvas.drawArc(rectF,p);
                        rightStartAngle += totalSweepAngle;
                    } else if (rightStartAngle < rightEndAngle) {
                        totalSweepAngle = Math.min(totalSweepAngle,(rightEndAngle - rightStartAngle));
                        canvas.drawArc(rectF,p);
                        rightStartAngle += totalSweepAngle;
                    }
                }

                if (i == periods.size() - 1 && rightStartAngle < rightEndAngle) {
                    p.setColor(rightColor);
                    //rightArrowColor = RED;
                    canvas.drawArc(rectF,p);
                }

                if (i == periods.size() - 1 && leftStartAngle < leftEndAngle) {
                    p.setColor(leftColor);
                    //leftArrowColor = RED;
                    canvas.drawArc(rectF,p);
                }
            }
        }

        p.setTextAlign(Paint.Align.CENTER);
        p.setColor(BLACK);
        p.setStyle(Paint.Style.FILL);
        p.setTypeface(Typeface.create("sans-serif",Typeface.BOLD));

        p.setTextSize(gHeight / 6.0F);
        float bitmapX = bitmap.getWidth() / 2.0F;
        float bitmapY = bitmap.getHeight() / 2.0F;

        p.setColor(rightArrowColor);
        //String rightArrow = "▶";
        String rightArrow = "▲";
        canvas.drawText(rightArrow,bitmapX - (bitmapX * 0.0052F),bitmapY - (bitmapY * 0.52F),p);

        p.setColor(leftArrowColor);
        //String leftArrow = "◀";
        String leftArrow = "▼";
        //float overflow = gHeight / 6.0F;
        canvas.drawText(leftArrow,bitmapX - (bitmapX * 0.0070F),bitmapY + (bitmapY * 0.72F),p);

        SimpleDateFormat sdfDate = new SimpleDateFormat("h:mma",Locale.getDefault());
        //Date Now = new Date();
        String text = sdfDate.format(date);
        p.setColor(BLACK);
        p.setTextAlign(Paint.Align.CENTER);
        p.setTextSize(gHeight / 8.5F);
        p.setTypeface(Typeface.create("sans-serif-medium",Typeface.norMAL));
        //canvas.drawText(text,rectF.centerX() - text.length() * 2 - 15F,rectF.centerY() + 5,p);
        canvas.drawText(text,canvas.getWidth() / 2.0F,canvas.getHeight() / 2.0F + (gHeight / 25.0F),p);
        p.setColor(GRAY);
        p.setTextSize(gHeight / 8.0F);
        p.setTextAlign(Paint.Align.CENTER);
        //String right = "R";
        float lWidth = (bitmap.getWidth() / 2.0F) + p.getTextSize();
        canvas.drawText("R",lWidth,bitmap.getHeight() / 2.60F,p);

        p.setTextAlign(Paint.Align.CENTER);
        //String left = "L";
        float rWidth = (bitmap.getWidth() / 2.0F) - p.getTextSize();
        canvas.drawText("L",rWidth,bitmap.getHeight() / 1.42F,p);

        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(),Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(output);
        final Paint paint = new Paint();
        final Rect rect = new Rect(0,bitmap.getWidth(),bitmap.getHeight());
        paint.setAntiAlias(true);
        c.drawARGB(0,0);
        c.drawCircle(bitmap.getWidth() / 2.0F,bitmap.getHeight() / 2.0F,bitmap.getWidth() / 2.0F,paint);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        c.drawBitmap(bitmap,rect,paint);

        return output;
    }

所有这些都发生在后台进程中,然后在主线程中: 我使用该位图来制作这样的标记

Marker marker = new Marker(mapView,null,coordinate);
Drawable mDrawable = new BitmapDrawable(requireActivity().getResources(),mapBitmap);
marker.setMarker(mDrawable);
marker.setAnchor(new PointF(0.5F,0.6F));
mapView.addMarker(marker);

我想要的:

我想为这些颜色设置动画,就像用户应该能够查看颜色正在绘制的动画一样。与所有这些任务一样,从数据库获取数据以及计算和绘制绘画的过程是一个非常长的过程,无法在主线程中完成,因此这就是所有这些都发生在后台线程中的原因。

我的问题是:有没有办法向用户展示实时动画?有没有办法让绘画动画化?

因为:

  1. 首先从数据库获取数据。
  2. 然后计算和组织数据。
  3. 然后,我在位图上绘制并返回它。
  4. 将位图转换为可绘制。
  5. 从 drawable 制作标记
  6. 向地图添加标记,最后图钉显示用户

牢记所有这些要点和限制,是否可以制作动画或有什么方法可以做到这一点?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)