首页 > 解决方案 > 如何在画布圈中设置图像视图或图标?

问题描述

如何在画布 Circle 中设置图像或图标?我有一个自定义画布视图,通过在地图上移动相机,调整大小方法将被激活并更改视图的形状,并通过停止地图的移动,它就像出厂设置...快乐英语:-))))

public class CancvasCircle extends androidx.appcompat.widget.AppCompatImageView {
  ///main circle  resize fields
  public static final int MAIN_CIRCLE_PRE_RADIUS = 40;
  public static final int MAIN_CIRCLE_POST_RADIUS = 43;
  public static final String MAIN_CIRCLE_PRE_STROKE_COLOR = "#69DAE2";
  //4CEAE3
  public static final String MAIN_CIRCLE_POST_STROKE_COLOR = "#FBCC38";
  ///// line resize fields
  public static final int LINE_HIEGHT_STOP = 45;
  public static final int LINE_HIEGHT_START_PRE = 0;
  public static final int LINE_HIEGHT_START_POST = 23;
  public static final int SHADOW_CIRCLE_PRE_RADIUS = 15;

  //circle paint fields
  Paint strokeCircle;
  Paint fillCircle;
  Paint shadowCircle;
  Paint line;
  Paint dot;

  //center
  float centerX;
  float centerY;

  //main circle fields
  private int radiusMain = MAIN_CIRCLE_PRE_RADIUS;
  private String colorMain = MAIN_CIRCLE_PRE_STROKE_COLOR;

  //line fields
  private float lineStartY;
  private float lineStopY;
  //shadow circle fields
  private int shadowRadius = SHADOW_CIRCLE_PRE_RADIUS;

  public CancvasCircle(Context context) {
    super(context);
    init();
  }

  public CancvasCircle(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    init();
  }

  public CancvasCircle(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
  }

  public void init() {

    strokeCircle = new Paint();
    strokeCircle.setAntiAlias(true);
    strokeCircle.setAntiAlias(true);
    strokeCircle.setStrokeWidth(10);
    strokeCircle.setStyle(Paint.Style.STROKE);

    fillCircle = new Paint();
    fillCircle.setAntiAlias(true);
    fillCircle.setColor(Color.parseColor("#BEC6CC"));
    fillCircle.setStyle(Paint.Style.FILL);

    shadowCircle = new Paint();
    shadowCircle.setAntiAlias(true);
    shadowCircle.setColor(Color.parseColor("#1f000000"));
    shadowCircle.setStyle(Paint.Style.FILL);

    line = new Paint();
    line.setAntiAlias(true);
    line.setColor(Color.parseColor("#000000"));
    line.setStrokeWidth(4);
    line.setStyle(Paint.Style.FILL);

    dot = new Paint();
    dot.setAntiAlias(true);
    dot.setColor(Color.parseColor("#000000"));
    dot.setStrokeWidth(4);
    dot.setStyle(Paint.Style.FILL);
  }

  public void resizeStrokeCircleParams(Boolean resize) {
    if (resize) {
      this.radiusMain = MAIN_CIRCLE_POST_RADIUS;
      this.colorMain = MAIN_CIRCLE_POST_STROKE_COLOR;
      this.lineStartY = centerY - LINE_HIEGHT_START_POST;
      this.lineStopY = LINE_HIEGHT_STOP + LINE_HIEGHT_START_POST - 10;
      this.shadowRadius =  LINE_HIEGHT_START_POST;

    } else {
      this.radiusMain = MAIN_CIRCLE_PRE_RADIUS;
      this.colorMain = MAIN_CIRCLE_PRE_STROKE_COLOR;
      this.lineStartY = centerY - LINE_HIEGHT_START_PRE;
      this.lineStopY = LINE_HIEGHT_STOP;
      this.shadowRadius = SHADOW_CIRCLE_PRE_RADIUS;
    }
    invalidate();
  }

  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    centerX = getWidth() / 2f;
    centerY = getHeight() / 2f;
    int radius = radiusMain;
    float lineStopY = this.lineStopY;
    float lineStartY = this.lineStartY;
    int shadowRadius = this.shadowRadius;

    strokeCircle.setColor(Color.parseColor(colorMain));


    canvas.drawCircle(centerX, centerY - lineStopY - radius, radius, strokeCircle);
    canvas.drawCircle(centerX, centerY - lineStopY - radius, radius, fillCircle);
    canvas.drawCircle(centerX, centerY, shadowRadius, shadowCircle);
    canvas.drawLine(centerX, lineStartY, centerX, centerY - lineStopY, line);
    canvas.drawPoint(centerX,centerY,dot);
  }
}

是否可以像硬币一样翻转两个图像????

标签: androidcanvasimageviewicons

解决方案


将示例视为自定义视图。

预览

public class ViewCircle extends View{
    final Bitmap bms; //source
    final Bitmap bmm; //mask
    final Paint paint;

    public ViewCircle( Context context ){
        super( context );
        bms = BitmapFactory.decodeResource( getResources(), R.drawable.pr_0000 );
        bmm = Bitmap.createBitmap( bms.getWidth(), bms.getHeight(), Bitmap.Config.ARGB_8888 );
        Canvas canvas = new Canvas( bmm );
        paint = new Paint( Paint.ANTI_ALIAS_FLAG );
        canvas.drawCircle( bmm.getWidth()/2, bmm.getHeight()/2, Math.min(bmm.getWidth()/2,bmm.getHeight()/2), paint );
        paint.setXfermode( new PorterDuffXfermode( PorterDuff.Mode.SRC_IN ) );
        canvas.drawBitmap( bms, 0, 0, paint );
    }
    @Override
    protected void onDraw( Canvas canvas ){
        super.onDraw( canvas );
        canvas.drawBitmap( bms, 0,0, null );
        canvas.drawBitmap( bmm, bms.getWidth(),0, null );
    }
}

推荐阅读