您的位置:首页 > 移动开发 > Android开发

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

2017-10-28 15:41 2795 查看
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(); //
图片坐标
[align=left]               [/align]
dst. left =
A;
dst. top =
B;
dst. right =
C;
dst. bottom =
D;

RectF dst = new RectF(); //
屏幕坐标
[align=left]               [/align]
dst. left =
E;
dst. top =
F;
dst. right =
G;
dst. bottom =
H;
[align=left]
[/align]

你可能会疑惑这些坐标都代表了什么意思。首先,一张图片肯定是以一个矩形的方式放在屏幕上的,那么如何定位这个矩形呢
,我们需要以下几个坐标:

矩形左端边线的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);
     }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: