小刚张嘎 2018-01-29 09:28 采纳率: 100%
浏览 1888
已采纳

怎么在自定义ImageView上Draw东西,然后获取为Bitmap?

public class MainActivity extends AppCompatActivity {

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    View view= View.inflate(this,R.layout.activity_main,null);
    //布局参数
    ViewGroup.LayoutParams layoutParams=new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);

    ImageView imageView=new ImageView(this);
    //设置布局参数
    imageView.setLayoutParams(layoutParams);
    imageView.setBackgroundColor(Color.RED);

    //把textview加入RelativeLayout中
    ((RelativeLayout)view).addView(imageView);

    //显示整个布局
    setContentView(view);
    setContentView(new SmileyView(this));




}

}

class SmileyView extends View {
private Paint mCirclePaint;
private float mCenterX;
private float mCenterY;
private float mRadius;

 public SmileyView(Context context) {
    this(context, null);
}

public SmileyView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public SmileyView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    initPaints();
}

private void initPaints() {
    mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    mCirclePaint.setStyle(Paint.Style.FILL);
    mCirclePaint.setColor(Color.YELLOW);
}

 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
     int w = MeasureSpec.getSize(widthMeasureSpec);
     int h = MeasureSpec.getSize(heightMeasureSpec);

     int size = Math.min(w, h);
     setMeasuredDimension(size, size);
 }

 protected void onSizeChanged(int w, int h, int oldw, int oldh) {
     mCenterX = w / 2f;
     mCenterY = h / 2f;
     mRadius = Math.min(w, h) / 2f;
 }

protected void onDraw(Canvas canvas) {
    canvas.drawCircle(mCenterX, mCenterY, mRadius, mCirclePaint);
    // draw eyes


}

}

上面这个代码如何修改为在ImageView上显示画的圆,然后把ImageView转化成Bitmap?麻烦具体点,我小白

  • 写回答

5条回答 默认 最新

  • brave_shine 2018-01-31 08:22
    关注

    之前写过一个类似的,不过没自定义控件,在画布上画的文字,再把控件内容覆盖到上面,跟你这反过来就行了,你可以参考一下:

    //截取scrollview的屏幕
    public static Bitmap getScrollViewBitmap(NestedScrollView scrollView) {
            int h = 0;
            Bitmap bitmap;
            for (int i = 0; i < scrollView.getChildCount(); i++) {
                    h += scrollView.getChildAt(i).getHeight();
            }
            // 创建相应大小的bitmap
            bitmap = Bitmap.createBitmap(scrollView.getMeasuredWidth(), h,
                            Bitmap.Config.ARGB_4444);
            final Canvas canvas = new Canvas(bitmap);
            canvas.drawColor(Color.parseColor("#FFFFFF"));
            drawTextToBitmap(scrollView.getContext(), canvas, scrollView.getMeasuredWidth(), h);
            scrollView.draw(canvas);
            return bitmap;
    }
    
    // 给图片添加水印
    public static void drawTextToBitmap(Context context, Canvas canvas, int width, int height) {
            String logo = "戚大爷";
            Paint paint = new Paint();
            paint.setColor(SkinManager.getInstance().getResourceManager().getColor("future_text_bg"));
            paint.setAlpha(80);
            paint.setAntiAlias(true);
            paint.setTextSize((float) DensityUtil.dip2px(context, 30));
            canvas.save();
            canvas.rotate(-30);
            float textWidth = paint.measureText(logo);
            int index = 0;
            for (int positionY = -DensityUtil.dip2px(context, 30); positionY <= height; positionY += DensityUtil.dip2px(context, 80)) {
                    float fromX = -0.75f * height + (index++ % 2) * textWidth;
                    for (float positionX = fromX; positionX < width; positionX += textWidth * 2) {
                            canvas.drawText(logo, positionX, positionY, paint);
                    }
            }
            canvas.restore();
    }
    

    希望能够帮助到你!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵