Android入门之画图详解

前文常用的控件介绍了不少,现在就来讨论一下手机开发中常用到的画图。要掌握Android的画图,首先就要了解一下,基本用到的如下一些图形接口:

1.Bitmap,可以来自资源/文件,也可以在程序中创建,实际上的功能相当于图片的存储空间;

2.Canvas,紧密与Bitmap联系,把Bitmap比喻内容的话,那么Canvas就是提供了众多方法操作Bitamp的平台;

3.Paint,与Canvas紧密联系,是"画板"上的笔刷工具,也用于设置View控件上的样式;

4.Drawable,如果说前三者是看不见地在内存中画图,那么Drawable就是把前三者绘图结果表现出来的接口。Drawable多个子类,例如:位图(BitmapDrawable)、图形(ShapeDrawable)、图层(LayerDrawable)等。

本文主要讲解如何在ImageView画图,以及如何直接在Button(继承View的控件)上面绘制自定义图像。如下图所示:

直接把资源图片画出来:

在ImageView上画图以及绘字:

直接在控件背景上画图:

main.xml的源码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
<Button android:id="@+id/Button01" android:layout_width="fill_parent" android:layout_height="44px" android:text="显示资源图片"></Button>
<Button android:id="@+id/Button02" android:layout_width="fill_parent" android:layout_height="44px" android:text="显示并绘画资源图片"></Button>
<Button android:id="@+id/Button03" android:layout_height="44px" android:layout_width="fill_parent" android:text="在控件上绘图"></Button>
<ImageView android:id="@+id/ImageView01" android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView>

</LinearLayout>

Java程序的源码如下:

package com.testDraw;

import android.app.Activity;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class testDraw extends Activity {

 ImageView iv;
 Button btn1,btn2,btn3,btn4;
 Resources r;
 @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    iv=(ImageView)this.findViewById(R.id.ImageView01);
    btn1=(Button)this.findViewById(R.id.Button01);
    btn2=(Button)this.findViewById(R.id.Button02);
    btn3=(Button)this.findViewById(R.id.Button03);

    btn1.setOnClickListener(new ClickEvent());
    btn2.setOnClickListener(new ClickEvent());
    btn3.setOnClickListener(new ClickEvent());

    r = this.getResources();
  }
 class ClickEvent implements View.OnClickListener {

 public void onClick(View v) {
  if(v==btn1)//显示资源图片
  {//功能等效
  //iv.setBackgroundResource(R.drawable.icon);//打开资源图片
  Bitmap bmp=BitmapFactory.decodeResource(r, R.drawable.icon);//打开资源图片
  iv.setImageBitmap(bmp);
  }
  else if(v==btn2)//显示并绘画资源图片
  {
     Bitmap bmp=BitmapFactory.decodeResource(r, R.drawable.icon);//只读,不能直接在bmp上画
     Bitmap newb = Bitmap.createBitmap( 300, 300, Config.ARGB_8888 );

     Canvas canvasTemp = new Canvas( newb );
     canvasTemp.drawColor(Color.TRANSPARENT);

     Paint p = new Paint();
     String familyName ="宋体";
     Typeface font = Typeface.create(familyName,Typeface.BOLD);
     p.setColor(Color.RED);
     p.setTypeface(font);
     p.setTextSize(22);
     canvasTemp.drawText("写字。。。",50,50,p);
     canvasTemp.drawBitmap(bmp, 50, 50, p);//画图
     iv.setImageBitmap(newb);
  }
  else if(v==btn3)//直接在Button上绘图
  {
  Bitmap newb = Bitmap.createBitmap( btn3.getWidth(), btn3.getHeight(), Config.ARGB_8888 );
  Canvas canvasTemp = new Canvas( newb );
    canvasTemp.drawColor(Color.WHITE);
    Paint p = new Paint();
  String familyName = "宋体";
  Typeface font = Typeface.create(familyName, Typeface.BOLD);
  p.setColor(Color.RED);
  p.setTypeface(font);
  p.setTextSize(20);
  canvasTemp.drawText("写字。。。", 30, 30, p);
  Drawable drawable = new BitmapDrawable(newb);
  btn3.setBackgroundDrawable(drawable);
  }
 }
 }
}
(0)

相关推荐

  • Android编程画图之抗锯齿解决方法

    本文实例分析了Android编程画图之抗锯齿解决方法.分享给大家供大家参考,具体如下: 在画图的时候,图片如果旋转或缩放之后,总是会出现那些华丽的锯齿.其实Android自带了解决方式. 方法一:给Paint加上抗锯齿标志.然后将Paint对象作为参数传给canvas的绘制方法. 复制代码 代码如下: paint.setAntiAlias(true); 方法二:给Canvas加上抗锯齿标志. 有些地方不能用paint的,就直接给canvas加抗锯齿,更方便. 复制代码 代码如下: canvas.

  • Android画图并保存图片的具体实现代码

    Canvas是一个画布,你可以建立一个空白的画布,就直接new一个Canvas对象,不需要参数.也可以先使用BitmapFactory创建一个Bitmap对象,作为新的Canvas对象的参数,也就是说这个画布不是空白的,如果你想保存图片的话,最好是Bitmap是一个新的,而不是从某个文件中读入进来的,或者是Drawable对象. 然后使用Canvas画第一张图上去,在画第二张图上去,最后使用Canvas.save(int flag)的方法进行保存,注意save方法里面的参数可以保存单个图层,如果

  • Android简单实现画图功能

    如何在图片上画画呢?这里写了一个demo,供大家参考 一.先看一眼工程结构 工程结构: 二.自定义view 这个自定义view实现了保留轨迹的功能,代码如下 package picturegame.view; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import and

  • Android入门之画图详解

    前文常用的控件介绍了不少,现在就来讨论一下手机开发中常用到的画图.要掌握Android的画图,首先就要了解一下,基本用到的如下一些图形接口: 1.Bitmap,可以来自资源/文件,也可以在程序中创建,实际上的功能相当于图片的存储空间: 2.Canvas,紧密与Bitmap联系,把Bitmap比喻内容的话,那么Canvas就是提供了众多方法操作Bitamp的平台: 3.Paint,与Canvas紧密联系,是"画板"上的笔刷工具,也用于设置View控件上的样式: 4.Drawable,如果

  • Android canvas drawBitmap方法详解及实例

     Android canvas drawBitmap方法详解及实例 之前自己在自定义view,用到canvas.drawBitmap(Bitmap, SrcRect, DesRect, Paint)的时候,对其中的第2和3个参数的含义含糊不清.看源码函数也没理解,然后看了一些其他的博客加上自己的理解,整理如下.首先,我们看一张图片,今天就要绘制这张图片. 然后将图片用红色的线条分成4个部分,如下: 我们自定义一个View,代码如下: public class PoterDuffLoadingVi

  • Android OkHttp基本使用详解

    Android系统提供了两种HTTP通信类,HttpURLConnection和HttpClient. 尽管Google在大部分安卓版本中推荐使用HttpURLConnection,但是这个类相比HttpClient实在是太难用,太弱爆了. OkHttp是一个相对成熟的解决方案,据说Android4.4的源码中可以看到HttpURLConnection已经替换成OkHttp实现了.所以我们更有理由相信OkHttp的强大. 使用范围 OkHttp支持Android 2.3及其以上版本. 对于Jav

  • Android分包MultiDex策略详解

    1.分包背景 这里首先介绍下MultiDex的产生背景. 当Android系统安装一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt.DexOpt的执行过程是在第一次加载Dex文件的时候执行的.这个过程会生成一个ODEX文件,即Optimised Dex.执行ODex的效率会比直接执行Dex文件的效率要高很多. 但是在早期的Android系统中,DexOpt有一个问题,DexOpt会把每一个类的方法id检索起来,存在一个链表结构里面.但是这个链表的长度是用一

  • Android系统对话框使用详解(最详细)

    在实际应用开发中,用到系统对话框中的情况几乎是没有的.按开发流程来说,UI工程师都会给出每一个弹窗的样式,故而在实际开发中都是自定义弹窗的. 即使用到的地方不多,但是我们也是需要了解并且能熟练的运用它,下面为大家奉上各种系统对话框的实现. 目录 一.系统对话框的几种类型与实现 在项目的实际开发中,用到的系统对话框几乎是没有的.原因大概包含以下几点: 样式过于单一,不能满足大部分实际项目中的需求. 对话框的样式会根据手机系统版本的不同而变化.不能达到统一的样式. 能实现的功能过于简单. 在这里先附

  • Android HandlerThread使用方法详解

    Android HandlerThread使用方法详解 HandlerThread 继承自Thread,内部封装了Looper. 首先Handler和HandlerThread的主要区别是:Handler与Activity在同一个线程中,HandlerThread与Activity不在同一个线程,而是别外新的线程中(Handler中不能做耗时的操作). 用法: import android.app.Activity; import android.os.Bundle; import androi

  • 基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解

    Pyplot matplotlib.pyplot是一个命令型函数集合,它可以让我们像使用MATLAB一样使用matplotlib.pyplot中的每一个函数都会对画布图像作出相应的改变,如创建画布.在画布中创建一个绘图区.在绘图区上画几条线.给图像添加文字说明等.下面我们就通过实例代码来领略一下他的魅力. import matplotlib.pyplot as plt plt.plot([1,2,3,4]) plt.ylabel('some numbers') plt.show() 上图是我们通

  • Android中menu使用详解

    Menu(菜单)是Android中一定会使用的模块,每个Android项目都会用到Menu来给用户起到选择和导航的作用,提升用户体验,下面通过本文给大家分享android 中menu使用,需要的朋友一起看看吧 很多activity界面中都存在一个菜单栏,就是点击右上角的一个按钮的时候会出现一个下拉列表差不多的东西,这个功能的实现其实只需要下面的两步,每一个activity都可以拥有自己独一无二的menu,具体的格式可以自己进行定义,详细的创建步骤如下 ①在res下的menu中创建file_men

  • Android xml解析实例详解

    Android  xml解析实例详解 实现效果图: XmlActivity package com.Android.xiong.gridlayoutTest; import android.app.Activity; import android.content.res.XmlResourceParser; import android.graphics.Color; import android.graphics.Typeface; import android.os.Bundle; impo

  • Android AOP注解Annotation详解(一)

    Android 注解Annotation 相关文章: Android AOP注解Annotation详解(一) Android AOP之注解处理解释器详解(二) Android AOP 注解详解及简单使用实例(三) Android AOP 等在Android上应用越来越广泛,例如框架ButterKnife,Dagger2,EventBus3等等,这里我自己总结了一个学习路程. - Java的注解Annotation - 注解处理解析器APT(Annotation Processing Tool)

随机推荐