项目中遇到的耗时点-(图片缩放里面添加的标记红圈无法缩放)

实现效果
在这里插入图片描述

1、需求:显示服务端返回的在线url图片,并且根据标记圈的坐标点和半径绘制到图片上

分析:由于涉及到图片上加标记,可考虑的方案有
1、加个父布局,里面嵌入两个ImageView
2、自定义ImageView、使其支持标图
考虑到熟练性、通用性、扩展性、选择方案二

package com.yyrc.shouTour.widget;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;

public class MyImageView extends androidx.appcompat.widget.AppCompatImageView {

    private final String TAG=MyImageView.class.getCanonicalName();
    Paint paint = new Paint();
     private float x;
    private float y;
    private float r=100;
    public MyImageView(Context context) {
        super(context);
    }

    public MyImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
 
    public void add(float x, float y, float r){//业务层传入坐标值
        shouldRemove=false;
        this.x=x;
        this.y=y;
        this.r=r;
        postInvalidate();//请求重绘,调用onDraw方法、使用Paint画笔,画到canvas上
    }

    public void remove(){
        shouldRemove=true;
        postInvalidate();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
             int radius = (int) r;
            paint.setColor(Color.RED);
            paint.setStrokeWidth(5);
            paint.setStyle(Paint.Style.STROKE);
            canvas.drawCircle(x, y, radius, paint);
    }
}

完成自定义控件后、还需要做一步工作,服务端返回给我的坐标、我们要做等比例调整
也就是我们要根据图片标记点坐标(后台返回)、真实宽高(通过API获取),以及手机屏幕宽高调整坐标点位置

2、需求变更:图片要支持放大拖拽

1、这样原先的自定义ImageView用不了, 在网上搜搜了一个支持拖拽放大的自定义ImageView
[photoView](https://github.com/NEW-MIKE/XPopup/)

为了同时保证拖拽缩放的时候标记的图片也会移动、缩放,这里使用了,重新生成bitmap的方式,把在线url图片和 标记的圈合并成一张新图片

在加载url图片时、重新生成新的bitmpa
 Bitmap newBitmap = Bitmap.createBitmap(1920, 1080, Bitmap.Config.ARGB_8888);//创建bitmap
                                     Canvas canvas = new Canvas(newBitmap);//创建画布
                                     Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, 1920, 1080, true);//重新修改bitmap宽高
                                     Log.e(TAG, "resizedBitmap x:" + resizedBitmap.getWidth() + " y:" + resizedBitmap.getHeight() );
                                
                                      canvas.drawBitmap(resizedBitmap, 0, 0, null);//修改宽高bitmap绘制进来
                                     paint.setColor(Color.RED);
                                     paint.setStrokeWidth(5);
                                     paint.setStyle(Paint.Style.STROKE);
                                     canvas.drawCircle(x, y, r, paint);//红色圆圈绘制进来
                                     photoView.setImageBitmap(newBitmap);//显示在控件上

总结

1、出现问题要会分析、要知道怎么查问题
比如为了解决这个问题,我们不是去改框架、而是通过重绘图片去适配框架

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值