在Rect android上绘制一个平铺的位图

前端之家收集整理的这篇文章主要介绍了在Rect android上绘制一个平铺的位图前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图沿矩形绘制位图,但我不知道如何去做.有没有办法使用paint属性或其他东西沿Rect对象平铺位图?我看了,但是我找不到任何能让它做我需要的东西,大多数的平铺选项都不会为特定的实例平铺它们,它们会在整个屏幕上平铺它,所以使用该位图的一切都结束了在没有滚动或任何东西的情况下,同时沿着所有这些位图平铺一个大位图.

有任何想法吗?如果您需要更多信息让我知道,这是一个奇怪的问题所以我知道我可能没有提到重要的事情.

威廉

解决方法

有几种方法可以攻击它.我在这里概述其中两个……

单程:

您可以在位图周围定义BitmapDrawable.将其TileMode设置为重复.通过setBounds(rect)给它一些边界,其中rect是你的Rect实例.

以下是使用View onDraw作为上下文的简短示例:

  1. public class MyView extends View {
  2. Rect rect;
  3. Bitmap mBitmap;
  4. BitmapDrawable mDrawable;
  5.  
  6. public MyView(Context context) {
  7. super(context);
  8. rect = new Rect(0,100,100);
  9. mBitmap = loadBitmap();
  10. mDrawable = new BitmapDrawable(context.getResources(),mBitmap);
  11. mDrawable.setTileModeXY(TileMode.REPEAT,TileMode.REPEAT);
  12. mDrawable.setBounds(rect);
  13. }
  14.  
  15. @Override
  16. protected void onDraw(Canvas canvas) {
  17. super.onDraw(canvas);
  18. mDrawable.draw(canvas);
  19. }
  20.  
  21. public Bitmap loadBitmap() {
  22. // included only for example sake
  23. Paint paint = new Paint();
  24. paint.setColor(Color.RED);
  25. Bitmap bm = Bitmap.createBitmap(10,10,Bitmap.Config.ARGB_8888);
  26. Canvas canvas = new Canvas(bm);
  27. canvas.drawRect(0,paint);
  28. paint.setStyle(Style.STROKE);
  29. paint.setColor(Color.BLUE);
  30. canvas.drawRect(0,9,paint);
  31. return bm;
  32. }
  33. }

注意:

您还可以在xml中定义BitmapDrawable,而不是在代码中执行.

另外,如果你知道你正在通过getResources()加载drawable .getDrawable(resourceId)确实只是一个Bitmap,你可以将它转换为BitmapDrawable并在那里设置TileMode.一个la:

  1. public class MyView extends View {
  2. Rect rect;
  3. BitmapDrawable mDrawable;
  4.  
  5. public MyView(Context context) {
  6. super(context);
  7. rect = new Rect(0,400,240);
  8. mDrawable = (BitmapDrawable) context.getResources().getDrawable(R.drawable.ic_launcher);
  9. mDrawable.setTileModeXY(TileMode.REPEAT,TileMode.REPEAT);
  10. mDrawable.setBounds(rect);
  11.  
  12. this.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.ic_launcher));
  13. }
  14.  
  15. @Override
  16. protected void onDraw(Canvas canvas) {
  17. super.onDraw(canvas);
  18. mDrawable.draw(canvas);
  19. }
  20. }

此示例显示正在拉伸的背景,并在其上方绘制平铺版本.

其他方式:

在x和y方向循环并重复将位图绘制到rect中:

  1. public class MyView extends View {
  2. Rect rect;
  3. Bitmap mBitmap;
  4.  
  5. public MyView(Context context) {
  6. super(context);
  7. rect = new Rect(0,100);
  8. mBitmap = loadBitmap();
  9. }
  10.  
  11. @Override
  12. protected void onDraw(Canvas canvas) {
  13. super.onDraw(canvas);
  14. final int bmWidth = mBitmap.getWidth();
  15. final int bmHeight = mBitmap.getHeight();
  16.  
  17. for (int y = 0,height = rect.height(); y < height; y += bmHeight) {
  18. for (int x = 0,width = rect.width(); x < width; x += bmWidth) {
  19. canvas.drawBitmap(mBitmap,x,y,null);
  20. }
  21. }
  22. }
  23.  
  24. public Bitmap loadBitmap() {
  25. // included only for example sake
  26. Paint paint = new Paint();
  27. paint.setColor(Color.RED);
  28. Bitmap bm = Bitmap.createBitmap(10,paint);
  29. return bm;
  30. }
  31. }

我个人会去第一个(BitmapDrawable)方法.

猜你在找的Android相关文章