android canvas.drawbitmap matrix

       大家好,很高兴能够为大家解答这个android canvas.drawbitmap matrix问题集合。我将根据我的知识和经验,为每个问题提供清晰和详细的回答,并分享一些相关的案例和研究成果,以促进大家的学习和思考。

1.android怎么画对角线 csdn

2.android开发 评论区怎么做

3.android 如何重写imageview 让有圆角效果

4.Android绘图之Canvas变换(6)

5.Android Bitmap 与 Drawable之间的区别和转换

6.Android 中关于ImageView.setImageViewMatrix(matrix)的问题

android怎么画对角线 csdn

       在Android中大家可能都知道对X,Y,Z轴旋转的方法,就是用Camera中提供了三种旋转方法,分别是rotateX()、rotateY()和rotateZ,调用这三个方法,并传入相应的角度,就可以让视图围绕这三个轴进行旋转。

       现在我就来说下如何进行对角线旋转,先上图看看效果!

       这个动画到底是如何实现的呢?我们以第二张来讲解,第一张如果大家喜欢可以下载源码去看看,因为动画的方式太多了,我

       这只是其中一种,学会了到底是如何以对角线来旋转的时候,大家可以充分利用想象力来实现多种多样的动画。

       这里我们还是要用到Camera这个类。

       [java] view plain copy

       canvas.rotate(45,centerX1,centerY1);//先对画布旋转45度

       mCamera.save();

       mCamera.rotateX(angle);//angle为动画不停旋转的角度

       mCamera.getMatrix(matrix1);

       mCamera.restore();

       matrix2 = new Matrix();

       matrix2.postRotate(-45);//再反旋转45度

       matrix1.setConcat(matrix1, matrix2);//这里必须是两个矩阵相乘,如果你用matrix1.postRotate(-45)的话还是对X轴进行旋转

       //这两个我百度的方法,不设置的话,旋转中心会改变

       matrix1.preTranslate(-centerX1, -centerY1);

       matrix1.postTranslate(centerX1, centerY1);

       canvas.drawBitmap(bitmap1, matrix1, bitmapPaint)

       然后我们用一个Animation不停的改变angle的值

       [java] view plain copy

       Animation animation = new Animation(){

       protected void applyTransformation(float interpolatedTime, Transformation t) { angle = interpolatedTime*200;

       if(angle > 180)

       {

       angle = 180;

       }

       invalidate();

       };

       }

android开发 评论区怎么做

       位图是我们开发中最常用的资源,毕竟一个漂亮的界面对用户是最有吸引力的。

       1. 从资源中获取位图

       可以使用BitmapDrawable或者BitmapFactory来获取资源中的位图。

       当然,首先需要获取资源:

       Resources res=getResources();

       复制代码

       使用BitmapDrawable获取位图

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

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

       // 读取InputStream并得到位图

       InputStream is=res.openRawResource(R.drawable.pic180);

       BitmapDrawable bmpDraw=new BitmapDrawable(is);

       Bitmap bmp=bmpDraw.getBitmap();

       复制代码

       或者采用下面的方式:

       BitmapDrawable bmpDraw=(BitmapDrawable)res.getDrawable(R.drawable.pic180);

       Bitmap bmp=bmpDraw.getBitmap();

       复制代码

       使用BitmapFactory获取位图

       (Creates Bitmap objects from various sources, including files, streams, and byte-arrays.)

       使用BitmapFactory类decodeStream(InputStream is)解码位图资源,获取位图。

       Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic180);

       复制代码

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

       以上方法在编程的时候可以自由选择,在Android SDK中说明可以支持的格式如下:png (preferred), jpg (acceptable), gif (discouraged),和bmp(Android SDK Support Media Format)。

       2. 获取位图的信息

       要获取位图信息,比如位图大小、像素、density、透明度、颜色格式等,获取得到Bitmap就迎刃而解了,这些信息在Bitmap的手册中,这里只是辅助说明以下2点:

        * 在Bitmap中对RGB颜色格式使用Bitmap.Config定义,仅包括ALPHA_8、ARGB_4444、ARGB_8888、RGB_565,缺少了一些其他的,比如说RGB_555,在开发中可能需要注意这个小问题;

        * Bitmap还提供了compress()接口来压缩,不过AndroidSAK只支持PNG、JPG格式的压缩;其他格式的需要Android开发人员自己补充了。

       3. 显示位图

       显示位图可以使用核心类Canvas,通过Canvas类的drawBirmap()显示位图,或者借助于BitmapDrawable来将Bitmap绘制到Canvas。当然,也可以通过BitmapDrawable将位图显示到View中。

       转换为BitmapDrawable对象显示位图

       // 获取位图

       Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic180);

       // 转换为BitmapDrawable对象

       BitmapDrawable bmpDraw=new BitmapDrawable(bmp);

       // 显示位图

       ImageView iv2 = (ImageView)findViewById(R.id.ImageView02);

       iv2.setImageDrawable(bmpDraw);

       复制代码

       使用Canvas类显示位图

       这儿采用一个继承自View的子类Panel,在子类的OnDraw中显示

       public class MainActivity extends Activity {

       /** Called when the activity is first created. */

       @Override

       public void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(new Panel(this));

       }

       class Panel extends View{

       public Panel(Context context) {

       super(context);

       }

       public void onDraw(Canvas canvas){

       Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180);

       canvas.drawColor(Color.BLACK);

       canvas.drawBitmap(bmp, 10, 10, null);

       }

       }

       }

       复制代码

       4. 位图缩放

       (1)将一个位图按照需求重画一遍,画后的位图就是我们需要的了,与位图的显示几乎一样:drawBitmap(Bitmapbitmap, Rect src, Rect dst, Paint paint)。

       (2)在原有位图的基础上,缩放原位图,创建一个新的位图:CreateBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)

       (3)借助Canvas的scale(float sx, float sy) (Preconcat the current matrix with the specified scale.),不过要注意此时整个画布都缩放了。

       (4)借助Matrix:

       Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180);

        Matrix matrix=new Matrix();

        matrix.postScale(0.2f, 0.2f);

        Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),

        bmp.getHeight(),matrix,true);

        canvas.drawColor(Color.BLACK);

        canvas.drawBitmap(dstbmp, 10, 10, null);

       5. 位图旋转

       同样,位图的旋转也可以借助Matrix或者Canvas来实现。

       Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180);

        Matrix matrix=new Matrix();

        matrix.postScale(0.8f, 0.8f);

        matrix.postRotate(45);

        Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),

        bmp.getHeight(),matrix,true);

        canvas.drawColor(Color.BLACK);

        canvas.drawBitmap(dstbmp, 10, 10, null);

       旋转效果:

       6.水印的生成方法

       生成水印的过程。其实分为三个环节:第一,载入原始;第二,载入水印;第三,保存新的。

       /**

       * create the bitmap from a byte array

       *

       * @param src the bitmap object you want proecss

       * @param watermark the water mark above the src

       * @return return a bitmap object ,if paramter's length is 0,return null

       */

       private Bitmap createBitmap( Bitmap src, Bitmap watermark )

       {

       String tag = "createBitmap";

       Log.d( tag, "create a new bitmap" );

       if( src == null )

       {

       return null;

       }

       int w = src.getWidth();

       int h = src.getHeight();

       int ww = watermark.getWidth();

       int wh = watermark.getHeight();

       //create the new blank bitmap

       Bitmap newb = Bitmap.createBitmap( w, h, Config.ARGB_8888 );//创建一个新的和SRC长度宽度一样的位图

       Canvas cv = new Canvas( newb );

       //draw src into

       cv.drawBitmap( src, 0, 0, null );//在 0,0坐标开始画入src

       //draw watermark into

       cv.drawBitmap( watermark, w - ww + 5, h - wh + 5, null );//在src的右下角画入水印

       //save all clip

       cv.save( Canvas.ALL_SAVE_FLAG );//保存

       //store

       cv.restore();//存储

       return newb;

       }

       7.Canvas的save和restore

       onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布。

       在onDraw方法里,我们经常会看到调用save和restore方法,它们到底是干什么用的呢?

save:用来保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作。

restore:用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响。

       save和restore要配对使用(restore可以比save少,但不能多),如果restore调用次数比save多,会引发Error。save和restore之间,往往夹杂的是对Canvas的特殊操作。

       例如:我们先想在画布上绘制一个右向的三角箭头,当然,我们可以直接绘制,另外,我们也可以先把画布旋转90°,画一个向上的箭头,然后再旋转回来(这种旋转操作对于画圆周上的标记非常有用)。然后,我们想在右下角有个20像素的圆,那么,onDraw中的核心代码是:

       int px = getMeasuredWidth();

       int py = getMeasuredWidth();

       // Draw background

       canvas.drawRect(0, 0, px, py, backgroundPaint);

       canvas.save();

       canvas.rotate(90, px/2, py/2);

       // Draw up arrow

       canvas.drawLine(px / 2, 0, 0, py / 2, linePaint);

       canvas.drawLine(px / 2, 0, px, py / 2, linePaint);

       canvas.drawLine(px / 2, 0, px / 2, py, linePaint);

       canvas.restore();

       // Draw circle

       canvas.drawCircle(px - 10, py - 10, 10, linePaint);

       效果如图1所示:

       如果我们不调用save和restore会是什么样子呢?如图2所示:

       从这两个图中,我们就能看到圆圈位置的明显差异。不进行Canvas的save和restore操作的话,所有的图像都是在画布旋转90°后的画布上绘制的。当执行完onDraw方法,系统自动将画布恢复回来。save和restore操作执行的时机不同,就能造成绘制的图形不同。

android 如何重写imageview 让有圆角效果

       android开发 评论区怎么做

        评论那块你可以新增一个文字编辑器,提交之后是肯定要储存到资料库中的,评论人的ID、评论物件的ID、评论标题、评论内容这些是肯定要有的。至于如何显示,那也是需要从资料库中去读取的,还有评论数你用数学函式就可以直接得到总数,或者通过SQL语句查询该物件的评论总数CONT(*) WHERE 物件ID栏位=‘值’

linux下怎么做android开发

        分为五个步骤来完成Android开发环境的搭建。

        第一步:安装JDK。

        要下载Oracle公司的JDK可以百度“JDK”进入Oracle公司的JDK下载页面,选择自己电脑系统的对应版本即可。

        第二步:配置Windows上JDK的变数环境 。

        JAVA_HOME

        先设定这个系统变数名称,变数值为JDK在电脑上的安装路径:C:\Program Files\Java\jdk1.8.0_20。建立好后则可以利用%JAVA_HOME%作为JDK安装目录的统一引用路径。

        Path

        PATH属性已存在,可直接编辑,在原来变数后追加:;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin 。

        CLASSPATH

        设定系统变数名为:CLASSPATH 变数值为:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar 。

        注意变数值字串前面有一个"."表示当前目录,设定CLASSPATH 的目的,在于告诉Java执行环境,在哪些目录下可以找到您所要执行的Java程式所需要的类或者包。

        第三步: 下载安装Eclipse(已上传附件,电脑开启可下载) 。

        Eclipse为Java应用程式及Android开发的IDE(整合开发环境)。Eclipse不需要安装,下载后把解压包解压后,剪下eclipse资料夹到你想安装的地方,开启时设定你的工作目录即可。

        第四步:下载安装Android SDK 。

        配置了JDK变数环境,安装好了Eclipse,这个时候如果只是开发普通的JAVA应用程式,那么Java的开发环境已经准备好了。我们要通过Eclipse来开发Android应用程式,那么我们需要下载Android SDK(Sofare Development Kit)和在Eclipse安装ADT,这个能让Eclipse和Android SDK关联起来。

        第五步:为Eclipse安装ADT。

        前面已经配置好了java的开发环境,安装了开发Android的IDE,下载安装了Android SDK,但是Eclipse还没有和Android SDK进行关联,也就是它们现在是互相独立的,就好比枪和子弹分开了。为了使得Android应用的建立,执行和除错更加方便快捷,Android的开发团队专门针对Eclipse IDE定制了一个:Android Development Tools(ADT)。

android开发 app怎么做

        现在网上关于android的案例很多,原理几乎都大同小异,无非都是主程式启动代理Activity然后通过DexClassLoader系结上的元件。

       

android开发debug除错怎么做

        1.在程式中新增一个断点

        如果所示:在Eclipse中添加了一个程式断点

        在Eclipse中一共有三种新增断点的方法

        第一种: 在红框区域右键出现选单后点击第一项 Toggle Breakpoint 将会在你右键程式码的哪一行新增一个程式断点 (同样的操作方可取消程式断点)

        第二种: 在红框区域双击滑鼠左键将会在你双击程式码的哪一行新增一个程式断点 (同样的操作方可取消程式断点)

        第三种 :在游标停留的地方使用快捷键 Ctrl + Shift + B 将会在游标停留的这一行新增一个程式断点 (同样的操作方可取消程式断点)

        2.执行Debug 除错 让程式停留在新增的断点上

        如下图所示,在红框内点选下拉选单选中需要除错的专案 则开始执行Debug除错

        如果不在下拉表中选直接点选表示Debug执行预设专案(预设专案为上一次执行的专案)

        Debug除错 快捷键为单击F11

        分析一下如何科学的新增程式断点, 上图中我为了加断点检视生成出来随机数的值我一共添加了6个程式断点,绿框表示最为科学的断点位置 ,红框表示不科学的位置。 我们分析一下为什么, 如果switch case 中的程式码片段过长 或者 case 的数量过多 如果采用红框的方式来新增程式断点,程式设计师须要新增很多程式断点万一有疏漏 所以会很难快速定位程式码执行到了那里 ,如果使用绿框的方式新增程式断点,程式设计师只须要在断点出按 F6 单步跳过这一行程式码就会走进正确的case中方便继续除错。

        Debug除错执行后,程式停在了红框处,按F6单步跳过 发现随机数为4 程式停留在了绿框中,程式设计师可以迅速定位random的值为4

        3.程式停留后检视变数的数值

        关闭

qq阅读怎么在评论区发图

        参考答案:

        QQ空间评论发的方法:1、开启QQ好友空间,找到要评论的说说。

        2、输入评论内容,点选后面的“相机”图示。

        3、可以选择从本地或者相簿中新增,以本地为例,选择照片“开启”即可新增。

        4、新增完成点选“发表”即可(可以新增3张照片,点选“新增”可以继续新增)。

android开发怎么做控制元件适配

        可以使用函式,比如初始化控制元件可以用initView()函式,写响应可以使用onClick()函式,程式码清晰得很,可以这样做。

android开发怎么做画板工具箱

        千锋扣丁学堂Android开发入门为您解答:

        public class MainActivity extends Activity {

        private ImageView iv;

        private Bitmap baseBitmap;

        private Canvas canvas;

        private Paint paint;

        @Override

        protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        this.iv = (ImageView) this.findViewById(R.id.iv);

        建立一张空白

        baseBitmap = Bitmap.createBitmap(480, 640, Bitmap.Config.ARGB_8888);

        建立一张画布

        canvas = new Canvas(baseBitmap);

        画布背景为灰色

        canvas.drawColor(Color.GRAY);

        建立画笔

        paint = new Paint();

        画笔颜色为红色

        paint.setColor(Color.RED);

        宽度5个画素

        paint.setStrokeWidth(5);

        先将灰色背景画上

        canvas.drawBitmap(baseBitmap, new Matrix(), paint);

        iv.setImageBitmap(baseBitmap);

        iv.setOnTouchListener(new OnTouchListener() {

        int startX;

        int startY;

        @Override

        public boolean onTouch(View v, MotionEvent event) {

        switch (event.getAction()) {

        case MotionEvent.ACTION_DOWN:

        获取手按下时的座标

        startX = (int) event.getX();

        startY = (int) event.getY();

        break;

        case MotionEvent.ACTION_MOVE:

        获取手移动后的座标

        int sX = (int) event.getX();

        int sY = (int) event.getY();

        在开始和结束座标间画一条线

        canvas.drawLine(startX, startY, sX, sY, paint);

        实时更新开始座标

        startX = (int) event.getX();

        startY = (int) event.getY();

        iv.setImageBitmap(baseBitmap);

        break;

        }

        return true;

        }

        });

        }

        public void save(View view) {

        try {

        File file = new File(Environment.getExternalStorageDirectory(),

        System.currentTimeMillis() + ".jpg");

        OutputStream stream = new FileOutputStream(file);

        baseBitmap.press(CompressFormat.JPEG, 100, stream);

        stream.close();

        模拟一个广播,通知系统sdcard被挂载

        Intent intent = new Intent();

        intent.setAction(Intent.ACTION_MEDIA_MOUNTED);

        intent.setData(Uri.fromFile(Environment

        .getExternalStorageDirectory()));

        sendBroadcast(intent);

        Toast.makeText(this, "储存成功", 0).show();

        } catch (Exception e) {

        Toast.makeText(this, "储存失败", 0).show();

        e.printStackTrace();

        }

        }

        }

        简单的布局档案

        <relativelayout xmlns:android=":codingke./courses-android-2." xmlns:tools=":codingke./courses-android-2." android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity">

        <button android:id="@+id/button1" android:onclick="save" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignparentbottom="true" android:text="储存">

        <imageview android:layout_above="@id/button1" android:id="@+id/iv" android:layout_width="match_parent" android:layout_height="match_parent">

        </imageview></button></relativelayout>

android开发 功能指导页怎么做csdn

        您好,很高兴能帮助您,

        android是基于linux的,所以在ubuntu下是最好的。当然windows下面也是可以的。但是android的核心是基于linux的,并且通过终端进行各种操作,非常强大,也比cmd方便。我现在自己开发的环境是这样的:

        ubuntu系统,以前我是windows然后安装了ubuntu的虚拟机器。android大部分的开发都是中间层到顶层的应用开发,所以基本上是java开发。表配如下:

        1。eclipse是开发java必备,也是android必备。(当然前提是先安装JDK1.6)

        2。下载android的SDK和ADT。这是android的开发必须的工具,adb、ddms、mksdcard、aapt,debug 必备

        A。安装完eclipse后,通过help=〉install new sofare 。。把ADT安装好

        B。然后window=>preference设定好SDK的路径即可

        如果用到C开发的话,可以安装一下啊CDT

        现在可以通过AVD manager安装一下你想在哪个平台下的api,比如:android2.3.4,就可以建一个2.3.4的emulator,把模拟器跑起来。通过adb ddms 等工具察看、开发了。为了方便,把adb的路径加到环境变数里。

        你的采纳是我前进的动力,还有不懂的地方,请你继续“追问”!

        如你还有别的问题,可另外向我求助;答题不易,互相理解,互相帮助!

起点在小说评论区不能评论怎么破 请检视自己的经验等级,是否达到可以评论的级别。不够的话,去攒经验值升级。

        若是达到,看看自己是否被禁言,可以找客服解决。

android开发fragment中怎么做搜寻引擎

        自从Android 3.0中引入fragments 的概念,根据词海的翻译可以译为:碎片、片段。其目的是为了解决不同萤幕分辩率的动态和灵活UI设计。大萤幕如平板小萤幕如手机,平板电脑的设计使得其有更多的空间来放更多的UI元件,而多出来的空间存放UI使其会产生更多的互动,从而诞生了fragments 。

        fragments 的设计不需要你来亲自管理view hierarchy 的复杂变化,通过将Activity 的布局分散到frament 中,可以在执行时修改activity 的外观,并且由activity 管理的back stack 中储存些变化。当一个片段指定了自身的布局时,它能和其他片段配置成不同的组合,在活动中为不同的萤幕尺寸修改布局配置(小萤幕可能每次显示一个片段,而大萤幕则可以显示两个或更多)。

        Fragment必须被写成可重用的模组。因为fragment有自己的layout,自己进行事件响应,拥有自己的生命周期和行为,所以你可以在多个activity中包含同一个Fragment的不同例项。这对于让你的介面在不同的萤幕尺寸下都能给使用者完美的体验尤其重要。

Android绘图之Canvas变换(6)

       android 自定义圆角ImageView以及锯齿的处理

       看到很多人开发过程中要使用圆角时,解决方法有:

       1.重新绘制一张

       2.通过布局来配置

       3.通过重写View来实现

       其中1,2在这里就不讲了,重点讲讲方法三的实现。

       实现一:通过截取画布一个圆形区域与的相交部分进行绘制,缺点:锯齿明显,设置Paint,Canvas抗锯齿无效。

       package com.open.circleimageview.widget;

       import android.content.Context;

       import android.graphics.Bitmap;

       import android.graphics.Canvas;

       import android.graphics.Paint;

       import android.graphics.PaintFlagsDrawFilter;

       import android.graphics.Path;

       import android.graphics.Rect;

       import android.graphics.Region;

       import android.util.AttributeSet;

       import android.view.View;

       public class CircleImageViewA extends View {

        public CircleImageViewA(Context context, AttributeSet attrs, int defStyle) {

        super(context, attrs, defStyle);

        }

        public CircleImageViewA(Context context, AttributeSet attrs) {

        super(context, attrs);

        }

        public CircleImageViewA(Context context) {

        super(context);

        }

        private Bitmap bitmap;

        private Rect bitmapRect=new Rect();

        private PaintFlagsDrawFilter pdf=new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);

        private Paint paint = new Paint();

        {

        paint.setStyle(Paint.Style.STROKE);

        paint.setFlags(Paint.ANTI_ALIAS_FLAG);

        paint.setAntiAlias(true);// 设置画笔的锯齿效果。 true是去除,大家一看效果就明白了?

        }

        private Path mPath=new Path();

       

        public void setImageBitmap(Bitmap bitmap)

        {

        this.bitmap=bitmap;

        }

       

        @Override

        protected void onDraw(Canvas canvas) {

        if(null==bitmap)

        {

        return;

        }

       

        bitmapRect.set(0, 0, getWidth(), getHeight());

       

        canvas.save();

        canvas.setDrawFilter(pdf);

        mPath.reset();

        canvas.clipPath(mPath); // makes the clip empty

        mPath.addCircle(getWidth()/2, getWidth()/2, getHeight()/2, Path.Direction.CCW);

        canvas.clipPath(mPath, Region.Op.REPLACE);

        canvas.drawBitmap(bitmap, null, bitmapRect, paint);

        canvas.restore();

        }

       

       

       }

       实现二:通过PorterDuffXfermode 方式(注意要设置硬件加速,否则部分机子无效),优点:锯齿基本没有

       package com.open.circleimageview.widget;

       import android.content.Context;

       import android.graphics.Bitmap;

       import android.graphics.Canvas;

       import android.graphics.Color;

       import android.graphics.Paint;

       import android.graphics.PaintFlagsDrawFilter;

       import android.graphics.PorterDuff;

       import android.graphics.PorterDuffXfermode;

       import android.graphics.Rect;

       import android.graphics.RectF;

       import android.util.AttributeSet;

       import android.view.View;

       public class CircleImageViewB extends View {

        public CircleImageViewB(Context context, AttributeSet attrs, int defStyle) {

        super(context, attrs, defStyle);

        init();

        }

        public CircleImageViewB(Context context, AttributeSet attrs) {

        super(context, attrs);

        init();

        }

        public CircleImageViewB(Context context) {

        super(context);

        init();

        }

        private Bitmap bitmap;

        private Rect bitmapRect=new Rect();

        private PaintFlagsDrawFilter pdf=new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);

        private Paint paint = new Paint();

        {

        paint.setStyle(Paint.Style.STROKE);

        paint.setFlags(Paint.ANTI_ALIAS_FLAG);

        paint.setAntiAlias(true);// 设置画笔的锯齿效果。 true是去除,大家一看效果就明白了?

        }

        private Bitmap mDstB=null;

        private PorterDuffXfermode xfermode=new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY);

       

       

        private void init()

        {

        try {

        if(android.os.Build.VERSION.SDK_INT>=11)

        {

        setLayerType(LAYER_TYPE_SOFTWARE, null);

        }

        } catch (Exception e) {

        e.printStackTrace();

        }

        }

        public void setImageBitmap(Bitmap bitmap)

        {

        this.bitmap=bitmap;

        }

        private Bitmap makeDst(int w, int h)?

        {

        Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);

        Canvas c = new Canvas(bm);

        Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);

        p.setColor(Color.parseColor("#ffffffff")); ?

        c.drawOval(new RectF(0, 0, w, h), p);

        return bm;

        }

       

        @Override

        protected void onDraw(Canvas canvas) {

        if(null==bitmap)

        {

        return;

        }

       

        if(null==mDstB)

        {

        mDstB=makeDst(getWidth(), getHeight());

        }

       

        bitmapRect.set(0, 0, getWidth(), getHeight());

        canvas.save();

        canvas.setDrawFilter(pdf);

        canvas.drawBitmap(mDstB, 0, 0, paint);

        paint.setXfermode(xfermode);

        canvas.drawBitmap(bitmap, null, bitmapRect, paint);

        paint.setXfermode(null);

        canvas.restore();

        }

       

       }

Android Bitmap 与 Drawable之间的区别和转换

        前面讲解了Canvas的基本概念, Android绘图之Canvas概念理解(5) ,

        对Canvas的概念进行了分析,但是没有说明和屏幕的关系,Canvas不等于屏幕,屏幕不会动的,我们也无法对屏幕进行(平移,缩放等)操作,只能对Canvas进行操作,所以对Canvas进行操作,屏幕不动,最终会导致看到的图像不同。

        下面开始讲解Canvas的变幻操作:

        包括:translate,rotate,scale,skew,clip,clipout,matrix

        先从最简单的平移开始:

        对Canvas进行平移,

        dx: x轴方向进行平移,正值向屏幕右侧

        dy:y轴方向进行平移,正值向屏幕下方

        绘制两个点查看原点位置。

        原点显然改变了,以后再绘制任何形状都是以translate后的原点开始绘制。

        参数说明

        sx:横向的缩放,默认为1,小数缩小,整数放大

        sy:纵向的缩放,默认为1,小数缩小,整数放大

        px,py,看源码知道是先translate,执行sx,sy然后再translate反方向。

        第二次translate的坐标为(-px sx,-px sy),最终的效果就是px,py是缩放后不动的点。

        缩放后坐标减半。

        如果想控制缩放后的位置,如何控制呢,这就需要第二个函数。

        还可以控制其他位置,例如控制缩放后在中心。

        rotate有两个函数:

        rotate(float degrees)

        rotate(float degrees, float px, float py)

        Degree:旋转的角度,正值为顺时针,负值为逆时针

        Px,py:旋转的中心,如果不指定旋转中心默认为(0,0)点

        指定旋转中心为矩形中心

        参数说明:

        sx:画布在x方向上倾斜相应的角度,sx倾斜角度的tan值,

        sy:画布在y轴方向上倾斜相应的角度,sy为倾斜角度的tan值,

        根据矩形或者路径裁剪画布,画布被切割之后,只有部分区域可用,其他区域无法绘制内容。

        Clip函数切割的区域可用,clipOut未被切割的区域可用。(过时函数不再讲解)

        Matrix提供了一些方法来控制变换:

        android绘图之Paint(1)

        android绘图之Canvas基础(2)

        Android绘图之Path(3)

        Android绘图之drawText绘制文本相关(4)

        Android绘图之Canvas概念理解(5)

        Android绘图之Canvas变换(6)

        Android绘图之Canvas状态保存和恢复(7)

        Android绘图之PathEffect (8)

        Android绘图之LinearGradient线性渐变(9)

        Android绘图之SweepGradient(10)

        Android绘图之RadialGradient 放射渐变(11)

        Android绘制之BitmapShader(12)

        Android绘图之ComposeShader,PorterDuff.mode及Xfermode(13)

        Android绘图之drawText,getTextBounds,measureText,FontMetrics,基线(14)

        Android绘图之贝塞尔曲线简介(15)

        Android绘图之PathMeasure(16)

        Android 动态修改渐变 GradientDrawable

Android 中关于ImageView.setImageViewMatrix(matrix)的问题

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

       1.bitmap 转换 drawable

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

//Drawable?drawable?=?new?FastBitmapDrawable(bitmap);

       2.Drawable to Bitmap

       BitmapDrawable, FastBitmapDrawable直接用getBitmap

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

?Canvas?canvas?=?new?Canvas(bitmap)

drawable.draw(canvas);

Drawable?d?=?ImagesList.get(0);?Bitmap?bitmap?=?((BitmapDrawable)d).getBitmap();

       区别如下:

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

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

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

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

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

       通过ontouch捕获手势,单点移动,双点缩放

       然后就通过画布本身缩放就行了啊,楼上的drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint)就可以

       今天关于“android canvas.drawbitmap matrix”的探讨就到这里了。希望大家能够更深入地了解“android canvas.drawbitmap matrix”,并从我的答案中找到一些灵感。