Android利用canvas画画板
首先新建一个项目工程,建立文件,如下图所示
首先配置页面布局文件activity_main.xml,如下图所示:
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical"> 6 7 <ImageView 8 android:id="@+id/iv" 9 android:layout_width="wrap_content" 10 android:layout_height="wrap_content" 11 android:background="@drawable/bg" 12 /> 13 <TextView 14 android:layout_width="wrap_content" 15 android:layout_height="wrap_content" 16 android:text="画笔的粗细" 17 /> 18 <SeekBar 19 android:id="@+id/sb" 20 android:layout_width="match_parent" 21 android:layout_height="wrap_content" 22 android:max="256" 23 /> 24 <TextView 25 android:layout_width="wrap_content" 26 android:layout_height="wrap_content" 27 android:text="颜色" 28 /> 29 <Spinner 30 android:id="@+id/sp" 31 android:layout_width="wrap_content" 32 android:layout_height="wrap_content" 33 android:entries="@array/color" 34 /> 35 <Button 36 android:id="@+id/btn" 37 android:layout_width="wrap_content" 38 android:layout_height="wrap_content" 39 android:text="保存" 40 /> 41 42 43 44 </LinearLayout>
然后书写主页的代码MainActivity.java代码如下
1 package com.xunfang.drawing; 2 3 import java.io.File; 4 import java.io.FileNotFoundException; 5 import java.io.FileOutputStream; 6 7 import android.app.Activity; 8 import android.content.Intent; 9 import android.graphics.Bitmap; 10 import android.graphics.Bitmap.CompressFormat; 11 import android.graphics.BitmapFactory; 12 import android.graphics.Canvas; 13 import android.graphics.Color; 14 import android.graphics.Matrix; 15 import android.graphics.Paint; 16 import android.net.Uri; 17 import android.os.Bundle; 18 import android.os.Environment; 19 import android.util.MonthDisplayHelper; 20 import android.view.Menu; 21 import android.view.MenuItem; 22 import android.view.MotionEvent; 23 import android.view.View; 24 import android.view.View.OnClickListener; 25 import android.view.View.OnTouchListener; 26 import android.widget.AdapterView; 27 import android.widget.AdapterView.OnItemClickListener; 28 import android.widget.AdapterView.OnItemSelectedListener; 29 import android.widget.Button; 30 import android.widget.ImageView; 31 import android.widget.SeekBar; 32 import android.widget.Spinner; 33 import android.widget.Toast; 34 35 36 public class MainActivity extends Activity { 37 private SeekBar sb; 38 private ImageView iv; 39 private Button btn; 40 private Spinner sp; 41 private String[] color ; 42 43 private Bitmap bm; 44 private Bitmap copy; 45 private Canvas canvas; 46 private Paint paint; 47 private File file; 48 private int yanse; 49 50 @Override 51 protected void onCreate(Bundle savedInstanceState) { 52 super.onCreate(savedInstanceState); 53 setContentView(R.layout.activity_main); 54 55 //拿到在xml文件中定义的颜色数组 56 color = getResources().getStringArray(R.array.color) ; 57 //实例化 58 initData(); 59 //设置监听器 60 setLister(); 61 //画画 62 loadingImage(); 63 64 } 65 private void loadingImage() { 66 // 加载原始图片 67 bm = BitmapFactory.decodeResource(getResources(), R.drawable.bg); 68 // 需要创建一个和原始的图片大小一样的空白图片(一张纸,上面没有任何数据) 69 copy = bm.createBitmap(bm.getWidth(), bm.getHeight(), bm.getConfig()); 70 // 需要一个画板,画板上铺上白纸 71 canvas= new Canvas(copy); 72 // 创建画笔 73 paint= new Paint(); 74 75 // 给imageView空间加载一个滑动监听器 76 iv.setOnTouchListener(new OnTouchListener() { 77 int startx; 78 int starty; 79 @Override 80 public boolean onTouch(View v, MotionEvent event) { 81 // 拿到动作 82 int type = event.getAction(); 83 switch (type) { 84 case MotionEvent.ACTION_DOWN: 85 startx = (int) event.getX(); 86 starty = (int) event.getY(); 87 break; 88 case MotionEvent.ACTION_MOVE: 89 int endx = (int) event.getX(); 90 int endy = (int) event.getY(); 91 //画画 92 canvas.drawLine(startx, starty, endx, endy, paint); 93 startx = (int) event.getX(); 94 starty = (int) event.getY(); 95 iv.setImageBitmap(copy); 96 break; 97 case MotionEvent.ACTION_UP: 98 99 break; 100 } 101 return true; 102 } 103 }); 104 105 } 106 private void setLister() { 107 //下拉框 108 sp.setOnItemSelectedListener(new OnItemSelectedListener() { 109 @Override 110 public void onItemSelected(AdapterView<?> parent, View view, 111 int position, long id) { 112 Toast.makeText(getApplicationContext(), "你点击的是:" + color[position], 0).show(); 113 switch (position) { 114 case 1: 115 paint.setColor(Color.GREEN); 116 break; 117 case 2: 118 paint.setColor(Color.BLUE); 119 break; 120 case 3: 121 paint.setColor(Color.BLACK); 122 break; 123 case 4: 124 paint.setColor(Color.YELLOW); 125 break; 126 case 0: 127 paint.setColor(Color.RED); 128 break; 129 } 130 } 131 @Override 132 public void onNothingSelected(AdapterView<?> parent) { 133 } 134 }); 135 //保存 136 btn.setOnClickListener(new OnClickListener() { 137 @Override 138 public void onClick(View v) { 139 try { 140 //指定图片的存储路径 141 file = new File(Environment.getExternalStorageDirectory().getAbsoluteFile()+"/draw.png"); 142 FileOutputStream fos = new FileOutputStream(file); 143 copy.compress(CompressFormat.PNG, 100, fos); 144 Toast.makeText(getApplicationContext(), "保存成功", 0).show() ; 145 } catch (Exception e) { 146 } 147 //欺骗系统,告诉系统插入一个sd卡 148 Intent intent = new Intent(); 149 intent.setAction(intent.ACTION_MEDIA_MOUNTED); 150 intent.setData(Uri.fromFile(file)); 151 sendBroadcast(intent); 152 } 153 }); 154 } 155 private void initData() { 156 sb = (SeekBar) findViewById(R.id.sb); 157 btn = (Button) findViewById(R.id.btn); 158 sp = (Spinner) findViewById(R.id.sp); 159 iv = (ImageView) findViewById(R.id.iv); 160 } 161 162 163 }
AndroidManifest.xml配置文件如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.xunfang.drawing" 4 android:versionCode="1" 5 android:versionName="1.0" > 6 7 <uses-sdk 8 android:minSdkVersion="16" 9 android:targetSdkVersion="21" /> 10 11 <application 12 android:allowBackup="true" 13 android:icon="@drawable/ic_launcher" 14 android:label="@string/app_name" 15 android:theme="@style/AppTheme" > 16 <activity 17 android:name=".MainActivity" 18 android:label="@string/app_name" > 19 <intent-filter> 20 <action android:name="android.intent.action.MAIN" /> 21 22 <category android:name="android.intent.category.LAUNCHER" /> 23 </intent-filter> 24 </activity> 25 </application> 26 27 </manifest>
然后用虚拟机测试如下所示:
可以在模拟器看一下,生成的文件
表示验证成功了
转载于:https://www.cnblogs.com/ouysq/p/4641869.html
Android利用canvas画画板相关推荐
- Android可滑动画板,Android 利用 Canvas 画画板
首先新建一个项目工程,建立文件,如下图所示 首先配置页面布局文件activity_main.xml,如下图所示: xmlns:tools="http://schemas.android.co ...
- Android之Canvas画画板
前几篇都涉及到了Canvas,Paint,Bitmap的结合使用,这里就不多说了~ 现在我要写的是画画板这个项目~ 项目效果: 1.画笔的颜色的随意更改 2.画笔的大小也可以随着拖动条的拖动而改变 3 ...
- Android利用canvas画各种图形
为什么80%的码农都做不了架构师?>>> 1.首先说一下canvas类: Class Overview The Canvas class holds the "dra ...
- Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)
1.首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, ...
- Android利用canvas画各种图形(点、直线、弧、圆、扁圆、文字、矩形、多边形、曲线、圆角矩形)
1.首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, ...
- Android 实现图片画画板
本文主要讲述了Android 实现图片画画板 设计项目布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk ...
- 如何利用canvas画一个圆,并且填充颜色
如何利用canvas画一个圆,并且填充颜色(小白专用,大佬勿看) canvas基础 相信在此之前,你对canvas已经有一定的了解了,接下来我将介绍,如何利用canvas画一个圆. 1.新建一个htm ...
- 自绘动画android,(译)android利用Canvas和几何学绘制几何动画
1 创建圆形动画 首先需要画一些同心圆,并添加动画将同心圆的半径逐渐增加,即从同心圆中心向四周扩散的动画. 需要定义一些属性包括:同心圆间隔.圆线颜色.圆线宽度: 1dp @color/black 1 ...
- android图片_画画板
一.项目目录结构 二.activity_main.xml界面 三.activity_main.xml代码 <RelativeLayout xmlns:android="http://s ...
- 小程序canvas画画板签字版,touchmove时卡顿的问题(根本原因是因为vue语法中page.data导致视图层和逻辑层的频繁通讯导致)
起因 因为要做一个画画板的功能,所以使用了canvas组件,一开始好多人说小程序canvas性能特别差,也没太注意,做出来之后确实有点卡,而且每一笔touchmove时间越长越卡,最终导致页面卡到无法 ...
最新文章
- ASP.NET2.0 永恒密码之戒【月儿原创】
- 浅析Struts 体系结构与工作原理(图)
- 红旗Linux认证简介
- Facebook成功打破纸牌游戏Hanabi的AI系统得分纪录
- python3 矩阵运算_3.10 矩阵与线性代数运算
- Linux检查CPU过高的原因
- 2D转换之旋转rotate(CSS3)
- 添加文件夹语音_微信语音导出方法大全,微信群语音转发只需3步
- iOS开发之SQLite的Object-C封装
- JAVA全栈工程师之路
- 数据的存储------计算机中常见数据类型的存储方式(C语言解析)
- 从苏宁电器到卡巴斯基(第二部)第06篇:我在卡巴的日子 VI
- OEL8上VNC无法访问图形界面的解决方法
- pytorch实现straight-through estimator(STE)
- 打计算机游戏用英语怎么说,打游戏用英语怎么说
- 【好书推荐】《华为数据之道》
- 【C语言答案】第四次练习---循环进阶
- Vue 3.0使用高德地图 vue-amap
- 服务器pe启动不了系统,云服务器PE启动
- JSR303校验前端传递的数据
热门文章
- CF 570D. Tree Requests [dsu on tree]
- 替罪羊树模板(封装版)-----转自知乎
- js 时间任意格式化 ,又来造轮子了
- 一位程序员从业余项目被收购中所学到的
- U-Boot在FL2440上移植(四)----支持网卡DM9000和烧写yaffs文件系统
- Hybrid端口配置理解
- 学完Linux之后学什么语言,学习C语言一段时间后我们能做什么?
- 关于监听套接字的形象解释
- Collectors.summingDouble()
- 华为架构师_华为首席架构师刘敏:5G商业落地 中小企业如何分一杯羹?