Android 如何在 Canvas里 放多张图片

Android 如何在 Canvas里 放多张图片,第1张

方案只有一种:

1、转换为Bitmap对象

2、通过canvas的drawBitmap方法绘制对象

示例:

1、转换成Bitmap对象

 1)资源文件转换

Bitmap bmp=BitmapFactorydecodeResource(r, Rdrawableicon);//读取drawable下的icon,转换为bitmap对象

 2)根据路径转换

 public Bitmap convertToBitmap(String path, int w, int h) {

      BitmapFactoryOptions opts = new BitmapFactoryOptions();      

      optsinJustDecodeBounds = true;// 设置为ture只获取大小

      optsinPreferredConfig = BitmapConfigARGB_8888;//颜色值

      BitmapFactorydecodeFile(path, opts);//返回为空,opts返回大小。

      int width = optsoutWidth;//实际宽度

      int height = optsoutHeight;//实际高度

      float scaleWidth = 0f, scaleHeight = 0f;

      if (width > w || height > h) {//缩放

          // 缩放

          scaleWidth = ((float) width) / w;

          scaleHeight = ((float) height) / h;

      }

      optsinJustDecodeBounds = false;//设置缩放

      float scale = Mathmax(scaleWidth, scaleHeight);

      optsinSampleSize = (int)scale;//设置缩放比例

      WeakReference<Bitmap> weak = new WeakReference<Bitmap>(BitmapFactorydecodeFile(path, opts));//获取的弱引用,便于释放占用内存

      return BitmapcreateScaledBitmap(weakget(), w, h, true);//返回对象

  }

2、canvas上绘制

 Bitmap bmp;//获取的bitmap对象

 Paint p;//定义画笔

 canvasTempdrawBitmap(bmp, 50, 50, p);//在50,50位置绘制

lstFileItemsAdd(DirectoryGetFiles(fbdSelectedPath, PicName[i])[y]);

改为

lstFileItemsAdd( PathGetFileName(DirectoryGetFiles(fbdSelectedPath, PicName[i])[y]) );

Android bitmap和drawable的区别和转换如下:

1bitmap 转换 drawable

 Bitmap bitmap = new Bitmap(); Drawable drawable = new BitmapDrawable(bitmap);

 //Drawable drawable = new FastBitmapDrawable(bitmap);

2Drawable to Bitmap

BitmapDrawable, FastBitmapDrawable直接用getBitmap

 b 其他类型的Drawable用Canvas画到一个bitmap上

 Canvas canvas = new Canvas(bitmap)

     drawabledraw(canvas);

 Drawable d = ImagesListget(0); Bitmap bitmap =  ((BitmapDrawable)d)getBitmap();

区别如下:

1Bitmap - 称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565、RGB888。作为一种逐像素的显示对象执行效率高,但是缺点也很明显存储效率低。

2Drawable - 作为Android平下通用的图形对象,它可以装载常用格式的图像,比如GIF、PNG、JPG,当然也支持BMP,当然还提供一些高级的可视化对象,比如渐变、图形等。

另外还有如下相类似的格式:

Canvas - 名为画布,可以看作是一种处理过程,使用各种方法来管理Bitmap、GL或者Path路径,同时它可以配合Matrix矩阵类给图像做旋转、缩放等 *** 作,同时Canvas类还提供了裁剪、选取等 *** 作。

Paint - 可以把它看做一个画图工具,比如画笔、画刷。管理了每个画图工具的字体、颜色、样式。

解释:

1、首先创建一个Bitmap,并指定大小;

2、在该上创建一个新的画布Canvas,然后在画布上绘制,并保存即可;

3、需要保存的目录File,注意如果写的目录如“/sdcard/akai/”如果不存在的话,要先创建(filemkdirs()),否则FileOutputStream会报错No found;

4、需要添加权限:<uses-permission android:name="androidpermissionWRITE_EXTERNAL_STORAGE"/>

什么是画布呢 其实通过字面意思的理解就是用来绘画的地方,那么android里的画布是神马样子的呢?

在自定义画布中常用到下面3个类

Canvas

这些绘图方法中的每一个都需要指定一个Paint对象来渲染它

Paint

Paint也称为"刷子",Paint可以指定如何将基本图形绘制到位图上。

Paint类相当于一个笔刷和调色板。它可以选择如何使用上面描述的draw方法来渲染绘 制在画布上的基本图形。通过修改Paint对象,可以在绘图的时候控制颜色、样式、字体和特殊效果。最简单地,setColor可以让你选择一个Paint的颜色,而Paint对象的样式(使用setStyle控制)则可以决定是绘制绘图对象的轮廓(STROKE),还是只填充每一部 分(FILL),或者是两者都做(STROKE_AND_FILL)除了这些简单的控制之外,Paint类还支持透明度,另外,它也可以通过使用各种各样的阴影、过滤器和效果进行修改,从而提供由更丰富的、复杂的画笔和颜料组成的调色板。

从继承View类(或其子类)开始,并定义onDraw()回调方法。系统会调用该方法来完 成View对象自己的绘制请求。这也是通过Canvas对象来执行所有的图形绘制调用的地方,这个Canvas对象是由onDraw()回调方法传入的。

Android框架只在必要的时候才会调用onDraw()方法,每次请求应用程序准备完成图形 绘制任务时,必须通过调用invalidate()方法让该View对象失效。这表明可以在该View 对象上进行图形绘制处理了,然后Android系统会调用该View对象的onDraw()方(尽 管不保证该回调方法会立即被调用)。

在定制的View组件的onDraw()方法内部,使用给定的Canvas对象来完成所有的图形绘制处理(如Canvasdraw…()方法或把该Canvas对象作为参数传递给其他类的draw() 方法)。一旦onDraw()方法被执行完成,Android框架就会使用这个Canvas对象来绘制一个有系统处理的Bitmap对象。

下面是Paint一些常用方法:

Bitmap

Bitmap绘图的表面也称位图(这里详细说哈位图的功能)。

从资源中获取位图:

通过Resource的函数:InputStream openRawResource(int id)获取得到资源文件的数据流后,可以通过2种方式获得bitmap

使用BitmapDrawable :

使用BitmapDrawable(InputStream is)构造一个BitmapDrawable;

使用BitmapDrawable类的getBitmap()获取得到位图;

使用BitmapFactory使用BitmapFactory类decodeStream(InputStream is)解码位 图资源,获取位图BitmapFactory的所有函数都是static,这个辅助类可以通过资 源ID、路径、文件、数据流等方式来获取位图。

获取位图的信息

一般获取位图信息包括:位图大小、透明度、颜色格式等等,这些信息呢可以通过 三-一方法获取得到Bitmap就迎刃而解了,Android SDK中对Bitmap有详细说明,大家可以去详细了解哈。

显示位图

显示位图需要使用核心类Canvas,可以直接通过Canvas类的drawBirmap()显示位图,或者借助于BitmapDrawable来将Bitmap绘制到Canvas,下面的实例中会详细列举到

位图的缩放

位图的缩放,在Android SDK中提供了2种方法:

1:将一个位图按照需求重画一遍,画后的位图就是我们需要的了,与位图的显示几乎 一样:

drawBitmap(Bitmap bitmap, Rect src, Rectdst, Paint paint)

2:在原有位图的基础上,缩放原位图,创建一个新的位图:

createBitmap(Bitmap source, int x, int y,int width, int height, Matrix m, boolean filter)

位图旋转

位图的旋转,离不开Matrix。Android SDK提供了Matrix类,可以通过各种接口来设置 矩阵

android 处理工具

截取视频帧并转化为Bitmap

  C#读取文件路径

//获取包含清单的已加载文件的路径或 UNC 位置。

public static string

sApplicationPath = AssemblyGetExecutingAssembly ( )Location;

//result: X:\xxx\xxx\xxxdll (dll文件所在的目录+dll文件名)

//获取当前进程的完整路径,包含文件名(进程名)。

string str = thisGetType ( )AssemblyLocation;

//result: X:\xxx\xxx\xxxexe (exe文件所在的目录+exe文件名)

//获取新的 Process 组件并将其与当前活动的进程关联的主模块的完整路径,包含文件名(进程名)。

string str = SystemDiagnosticsProcessGetCurrentProcess (

)MainModuleFileName;

//result: X:\xxx\xxx\xxxexe (exe文件所在的目录+exe文件名)

//获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。

string str = SystemEnvironmentCurrentDirectory;

//result: X:\xxx\xxx (exe文件所在的目录)

//获取当前 Thread 的当前应用程序域的基目录,它由程序集冲突解决程序用来探测程序集。

string str = SystemAppDomainCurrentDomainBaseDirectory;

//result: X:\xxx\xxx\ (exe文件所在的目录+"\")

//获取和设置包含该应用程序的目录的名称。

string str =

SystemAppDomainCurrentDomainSetupInformationApplicationBase;

//result: X:\xxx\xxx\ (exe文件所在的目录+"\")

//获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称。

string str = SystemWindowsFormsApplicationStartupPath;

//result: X:\xxx\xxx (exe文件所在的目录)

//获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。

string str = SystemWindowsFormsApplicationExecutablePath;

//result: X:\xxx\xxx\xxxexe (exe文件所在的目录+exe文件名)

//获取应用程序的当前工作目录(不可靠)。

string str = SystemIODirectoryGetCurrentDirectory ( );

//result: X:\xxx\xxx (exe文件所在的目录)

在系统服务中最好用这个方式去取路径

string stmp = AssemblyGetExecutingAssembly ( )Location;

stmp = stmpSubstring ( 0 , stmpLastIndexOf ( '\\' )

);//删除文件名

if ( pathType == 1 )

return stmp + @"\inputLogxml";

else if ( pathType == 2 )

return stmp + @"\MiddleDBxml";

else

return stmp + @"\AppNoxml";

using SystemIO;

string path = "d:asdfasdfbmp";

string fileName = PathGetFileName(path); //文件名

string ext = PathGetExtension(path); //扩展名

SDK 中有专门取SD卡路径的静态方法

public String getSDPath(){

File sdDir = null;

boolean sdCardExist = EnvironmentgetExternalStorageState()

equals(AndroidosEnvironmentMEDIA_MOUNTED); //判断sd卡是否存在

if (sdCardExist) {

sdDir = EnvironmentgetExternalStorageDirectory();//获取跟目录

}

return sdDirtoString();

}

不要写死路径

xml文件设置背景中:

任意一个控件,button imageView 或layout,在其的xml属性设置中,添加

[java] android:background="@drawable/bg"

即可实现设置其背景为bg

其中bgbnp存放在drawable目录下。

drawable目录下存放大小图标共用的。drawable-hdpi中存放240 WVGA800 的模拟器或板子用的。drawable-mdpi存放对应的小

[java] <ImageView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:src="@drawable/pic"/>

同样,用src属性,也可设置imageView的为picpng

--------------------------------------------------------------------------------

java代码中设置或更改一个控件的背景:

[java] Resources resources = getContext()getResources();

Drawable btnDrawable = resourcesgetDrawable(Rdrawablelayout_bg);

layoutsetBackgroundDrawable(btnDrawable);

程序中,动态修改layout的背景,用setBackgroundDrawable()函数实现。设置其背景为 layout_bgpng

修改imageView1的背景为imageView2的背景:

imageView2getDrawable()可获得2的背景。值为Drawable类型

imageView1setImageDrawable(drawable); 设置imageView1的背景

即:

[java] imageView1setImageDrawable(imageView2getDrawable());

这里的实现原理很简单,就是添加多个矩形路径,并不断的延长各个矩形路径的宽度(通过onDraw方法的递归实现),然后在矩形路径中绘制Bitmap即可。

1 构建用于展示的Bitmap

这里我们选择在onSizeChanged方法中初始化Bitmap,因为当控件大小改变时方便我们重新计算所需展示Bitmap的大小。

2 构建矩形裁剪区域并添加到Path中

3 在对应的路径中绘制出Bitmap

这里使用Canvas的clipPath方法将画布裁切成路径的形状,然后在裁切后的画布上绘制。

4 利用递归实现动画效果

5 当完全显示时替换

完全显示也是cilpWidth>控件宽度的时候。

扫描式展示

以上就是关于Android 如何在 Canvas里 放多张图片全部的内容,包括:Android 如何在 Canvas里 放多张图片、C#获取图片路径问题、Android Bitmap 与 Drawable之间的区别和转换等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10628954.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存