Android简易实战教程--第二十四话《画画板》

原创 2016年08月29日 23:17:16

今天完成一个画画板。

首先来个布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" 
        />
	<LinearLayout 
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:orientation="horizontal"
	    android:layout_alignParentBottom="true"
	    >
	    <Button 
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:text="红色"
	        android:onClick="red"
	        />
	    <Button 
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:text="绿色"
	        android:onClick="green"
	        />
	    <Button 
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:text="刷子"
	        android:onClick="brush"
	        />
	    <Button 
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:text="保存"
	        android:onClick="save"
	        />
	</LinearLayout>
</RelativeLayout>

可见,要分红绿色,而且还要保存最后画的图片。

看一下主活动代码:

package com.itydl.paintban;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

public class MainActivity extends Activity {

	private ImageView iv;

	int startX;
	int startY;

	private Canvas canvas;

	private Paint paint;

	private Bitmap bmCopy;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		//加载画画板的背景图
		Bitmap bmSrc = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
		
		bmCopy = Bitmap.createBitmap(bmSrc.getWidth(), bmSrc.getHeight(), bmSrc.getConfig());
		paint = new Paint();
		canvas = new Canvas(bmCopy);
		//绘制
		canvas.drawBitmap(bmSrc, new Matrix(), paint);
		
		iv = (ImageView) findViewById(R.id.iv);
		iv.setImageBitmap(bmCopy);
		
		//设置触摸侦听
		iv.setOnTouchListener(new OnTouchListener() {
			
			//触摸屏幕时,触摸事件产生时,此方法调用
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				int action = event.getAction();
				switch (action) {
				//用户手指摸到屏幕
				case MotionEvent.ACTION_DOWN:
					startX = (int) event.getX();
					startY = (int) event.getY();
					break;
				//用户手指正在滑动
				case MotionEvent.ACTION_MOVE:
					int x = (int) event.getX();
					int y = (int) event.getY();
					canvas.drawLine(startX, startY, x, y, paint);
					//每次绘制完毕之后,本次绘制的结束坐标变成下一次绘制的初始坐标
					startX = x;
					startY = y;
					iv.setImageBitmap(bmCopy);
					break;
				//用户手指离开屏幕
				case MotionEvent.ACTION_UP:
					break;

				}
				//true:告诉系统,这个触摸事件由我来处理
				//false:告诉系统,这个触摸事件我不处理,这时系统会把触摸事件传递给imageview的父节点
				return true;
			}
		});
			
		
	}

	public void red(View v){
		paint.setColor(Color.RED);
	}
	public void green(View v){
		paint.setColor(Color.GREEN);
	}
	public void brush(View v){
		paint.setStrokeWidth(7);
	}
	public void save(View v){
		File file = new File("sdcard/dazuo.png");
		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream(file);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		bmCopy.compress(CompressFormat.PNG, 100, fos);
		
		//发送sd卡就绪广播
		Intent intent = new Intent();
		intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
		intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
		sendBroadcast(intent);
	}
}

运行看一下结果:

画了个绿帽子,哈哈。欢迎关注本博客点击打开链接  http://blog.csdn.net/qq_32059827,每天花上5分钟,阅读一篇有趣的安卓小文哦。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android开发笔记之简易画画板的制作

如果有这样的需求,有多种颜色可供选择,通过seekbar调节画笔的粗细,实现在画板上涂鸦的功能。没有考虑其他的功能,只是对前面有关Android图像处理和Canvas的知识进行一个运用。 一.布局 ...

Android简易实战教程--第五话《开发一键锁屏应用》

Device Administration 对于这个应用,市场上很多,但是看一下评论就知道效果有多差了,因为99%一键锁屏应用没办法卸载。今天就开发一个小应用,实现轻松点击一键锁屏,同时支持卸载。。。...

Android简易实战教程--第三十六话《电话录音》

今天完成一个简单的电话录音功能,即接通电话后,立即录下自己打电话的声音。实现起来比较简单:一个服务,一个TelephonyManager、一个MediaRecorder就够了。 1、布局提供一个开启录...

Android简易实战教程--第一话《最简单的计算器》

转载请注明出处: 从今天开始,本专栏持续更新Android简易实战类博客文章。和以往专栏不同,此专栏只有实例。每个实例尽量按照知识点对应相应一章节的内容去写,循序渐进。有些实例可能会与另一个专栏有重...

Android简易实战教程--第三话《自己实现打电话》

需要一个文本输入框输入号码,需要一个按钮打电话。本质:点击按钮,调用系统打电话功能。 xml布局文件代码:: ...

Android简易实战教程--第三十七话《NotifiCation》

通知的使用,无疑是Android系统的亮点之一;就连IOS在5.0开始也引入了类似通知的技巧。可见它的实用性。 今天这个小案例,就学习一下通知的基本使用,API是使用最新的API,4.3以前创建通知...

Android简易实战教程--第四十三话《上拉加载与下拉刷新》

ListView的下拉刷新很常见,很多开源的框架都能做到这个效果,当然也可以自己去实现。本篇案例是基于xlistview的。 布局: ...

Android简易实战教程--第二十话《通过广播接收者,对拨打电话外加ip号》

没睡着觉,起来更篇文章吧哈哈!首先祝贺李宗伟击败我丹,虽然我是支持我丹的,但是他也不容易哈哈,值得尊敬的人!切入正题:这一篇来介绍个自定义广播接收者。 通常我们在外拨电话的时候,一般为使用网络电话。...

Android简易实战教程--第九话《短信备份~二》

这一篇,承接地八话。使用高效的方式备份短信——xml序列化器。 存储短信,要以对象的方式存储。首先创建javabean: package com.itydl.createxml.domain; pu...

Android简易实战教程--第三十八话《自定义通知NotifiCation》

上一篇小案例,完成了一个普通的通知,点击通知启动了一个活动。但是那里的通知没有加入些“靓点”,这一篇就给它加入自定义的布局,完成自定义的通知。 应用:比如QQ音乐为例,当点击音乐播放的时候,手机屏幕上...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android简易实战教程--第二十四话《画画板》
举报原因:
原因补充:

(最多只允许输入30个字)