Android 使用Canvas中的drawBitmap方法绘制拉伸的图片

本文详细介绍了Android中使用drawBitmap方法进行图片拉伸与适配的技术细节,包括Rect和RectF类的使用方法及如何通过调整坐标实现图片的变形和拉伸。

drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint)
参数的含义:
Bitmap bitmap:需要处理的图片
Rect src:图片的坐标
RectF dst:需要绘制的图片所在位置的坐标
Paint paint:画笔类(处理图片时一般为null)


下面来介绍下Rect和RectF
android.graphics.RectF
android.graphics.Rect
From interface android.os.Parcelable

两个类都有四个public属性,分别为bottom,left,top,right,使用它们Java代码如下:
Rect dst = new Rect(); // 图片坐标
               
dst. left = A;
dst. top = B;
dst. right = C;
dst. bottom = D;
RectF dst = new RectF(); // 屏幕坐标
               
dst. left = E;
dst. top = F;
dst. right = G;
dst. bottom = H;

你可能会疑惑这些坐标都代表了什么意思。首先,一张图片肯定是以一个矩形的方式放在屏幕上的,那么如何定位这个矩形呢
我们需要以下几个坐标:
矩形左端边线的X轴坐标值Rect.left,    RectF.left
矩形右端边线的X轴坐标值Rect.right,    RectF.right
矩形上端的Y轴坐标值Rect.top,   RectF.top
矩形下端的Y轴坐标值Rect.bottom,   RectF.bottom

了解了这些坐标的含义之后,我们再来看看drawBitmap中是如何使用这些坐标的。

src参数:图片所在矩形的坐标。
例如,我有一张长120像素,宽80像素的图片,那么久可以新建这个坐标为:

Rect src = new Rect(); // 图像内的坐标
src. left = 0;
src. top = 0;
src. right = 120;
src. bottom = 80;

dst参数:图片需要摆放的坐标
例如,我需要把src图片摆放到屏幕左浮动20像素,向下浮动40像素的位置上

RectF dst = new Rect(); // 图像内的坐标
dst. left = 20;
dst. top = 40;
dst. right = 120+20;
dst. bottom = 80+40;

就是说把图片的left坐标放在屏幕的left坐标上,其他点的坐标也一样。
如果你需要对图片变形或者拉伸,就可以控制dst的坐标。


以下是所用到的类,用于一个书架排版的页面适应更宽的屏幕(使背景图片拉伸)

package com.vision.agriculture.classes.repository;


import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Rect;

import android.graphics.RectF;

import android.util.AttributeSet;

import android.widget.GridView;


import com.vision.agriculture.R;


public class MyGridView extends GridView {
     private Bitmap background;
     public MyGridView(Context context, AttributeSet attrs) {
          super(context, attrs);
          background = BitmapFactory.decodeResource(getResources(),
                    R.drawable.repo_gridview_layer_bg);
     }

     @Override
     protected void layoutChildren() {
          super.layoutChildren();
     }

     @Override
     protected void onMeasure(int widthMeasureSpec, intheightMeasureSpec) {
          super.onMeasure(widthMeasureSpec, heightMeasureSpec);
     }


     @Override
     protected void dispatchDraw(Canvas canvas) {
          int count = getChildCount();
          int top = count > 0 ? getChildAt(0).getTop() : 0;
          int backgroundWidth = background.getWidth();
          int backgroundHeight = background.getHeight();
          int width = getWidth();
          int height = getHeight();
          final Rect src = new Rect(); // 图像内的坐标
          src.left = 0;
          src.top = 0;
          src.right = backgroundWidth;
          src.bottom = backgroundHeight;
          for (int y = top; y < height; y += backgroundHeight) {
              RectF dst = new RectF(); //屏幕
              dst.left = 0;
              dst.top = y;
              dst.right = width;
              dst.bottom = y+backgroundHeight;
              canvas.drawBitmap(background, src, dst, null);
          }
          super.dispatchDraw(canvas);
     }
}





评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值