源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Android canvas drawBitmap方法详解及实例

  • 时间:2020-08-20 09:43 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Android canvas drawBitmap方法详解及实例
[b] Android canvas drawBitmap方法详解及实例[/b] 之前自己在自定义view,用到canvas.drawBitmap(Bitmap, SrcRect, DesRect, Paint)的时候,对其中的第2和3个参数的含义含糊不清。看源码函数也没理解,然后看了一些其他的博客加上自己的理解,整理如下。首先,我们看一张图片,今天就要绘制这张图片。 [img]http://files.jb51.net/file_images/article/201701/201701241442041.jpg[/img] 然后将图片用红色的线条分成4个部分,如下: [img]http://files.jb51.net/file_images/article/201701/201701241442062.png[/img] 我们自定义一个View,代码如下:
public class PoterDuffLoadingView extends View {

 private Resources mResources;
 private Paint mBitPaint;
 private Bitmap mBitmap;

 private int mTotalWidth, mTotalHeight;
 private Bitmap girlBitmap;
 private int girlBitWidth , girlBitHeight;
 private Rect girlSrcRect , girlDesRect;

 public PoterDuffLoadingView(Context context) {
  super(context);
  mResources = getResources();
  initBitmap();
 }

 private void initBitmap() {
  //美女图片的宽和高
  girlBitmap = ((BitmapDrawable)mResources.getDrawable(R.drawable.a1)).getBitmap();
  girlBitWidth = girlBitmap.getWidth();
  girlBitHeight = girlBitmap.getHeight();


 }

 @Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  canvas.drawBitmap(girlBitmap, girlSrcRect, girlDesRect, null);
 }
 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 }

 @Override
 protected void onSizeChanged(int w, int h, int oldw, int oldh) {
  Log.d("xxxxxx", "onSizeChanged , w = "+w+" , h = "+h+" , mBitWidth = "+mBitWidth+" , mBitHeight = "+mBitHeight);
  super.onSizeChanged(w, h, oldw, oldh);
  mTotalWidth = w;
  mTotalHeight = h;

  girlSrcRect = new Rect(0, 0, girlBitWidth, girlBitHeight);
  girlDesRect = new Rect(0, 0, girlBitWidth, girlBitHeight);

 }
}
其中:
girlSrcRect = new Rect(0, 0, girlBitWidth, girlBitHeight); 
表示要画的图就是整个图片的大小。我觉得girlSrcRect 就是指画图的大小范围。 girlDesRect :就是所画的图在View上的位置。表是距离左边和上边为0,右边(girlBitWidth - 0)就为图片的宽度,下边(girlBitHeight - 0)为图片的高度。 效果图如下 : [img]http://files.jb51.net/file_images/article/201701/201701241442063.png[/img] 当我们想移动图片的位置,代码如下:
girlDesRect = new Rect(20, 50, 20+girlBitWidth, 50+girlBitHeight);
表示图片的左边所在的位置为20个像素,图片的顶部在View上的位置为50个像素。图片右边在view上的位置为(20+girlBitWidth )即距离图片的左边的距离是:[(20+girlBitWidth )- 20]。底部一样的道理。 如图: [img]http://files.jb51.net/file_images/article/201701/201701241442064.png[/img] 如果我们只想画上述图片的第2部分,该怎么做呢?我们只需要做如下修改:
girlSrcRect = new Rect(girlBitWidth/2, 0, girlBitWidth, girlBitHeight/2);
  girlDesRect = new Rect(20, 50, 20+girlBitWidth, 50+girlBitHeight);
效果图: [img]http://files.jb51.net/file_images/article/201701/201701241442065.png[/img] 是不是就是显示图片的第二部分呢,细心的会发现这个图和之前整体的图片大小是一样的。原因是什么呢: girlSrcRect :表示我们要画图的部分。 girlDesRect :表示我们要绘图的位置。从上面的girlDesRect 值看出,绘图的位置的确是整个图片的位置。 那我们只想要1/4图的大小呢,怎么办?
girlSrcRect = new Rect(girlBitWidth/2, 0, girlBitWidth, girlBitHeight/2);
  girlDesRect = new Rect(20, 50, 20+girlBitWidth/2, 50+girlBitHeight/2);
如下图: [img]http://files.jb51.net/file_images/article/201701/201701241442066.png[/img] 好了,就到这里了,毕竟自己写的才回更深刻! 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部