layout:

<LinearLayout 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:orientation="vertical"
tools:context="com.example.paint.MainActivity" > <Button
android:onClick="save"
android:id="@+id/btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="保存" />
<Button
android:onClick="selectImage"
android:id="@+id/select"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="选择一个图片" /> <ImageView
android:layout_above="@id/select"
android:id="@+id/iv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>

main_activity

package com.example.paint;

import java.io.File;
import java.io.FileOutputStream; import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.ActionBarActivity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.Toast; public class MainActivity extends ActionBarActivity { 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); paint = new Paint();
//画笔宽度
paint.setStrokeWidth(5);
//画笔颜色
paint.setColor(Color.GREEN); //创建一个可以修改的bitmap
baseBitmap = Bitmap.createBitmap(320, 350, Config.ARGB_8888);
//创建一个画布
canvas = new Canvas(baseBitmap);
//设置背景色
canvas.drawColor(Color.WHITE); iv = (ImageView)findViewById(R.id.iv); //知道用户手指在平美国上移动的轨迹
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 newX = (int)event.getX();
int newY = (int)event.getY();
//画线
canvas.drawLine(startX, startY, newY, newY, paint); //重新更新画笔开始位置
startX = (int)event.getX();
startY = (int)event.getY();
iv.setImageBitmap(baseBitmap);
break;
case MotionEvent.ACTION_UP: //手指离开屏幕的动作 break; } //return true 表示画笔一直触动
return true;
} });
} public void selectImage(View view)
{
Intent intent = new Intent();
intent.setAction(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, 0); } @Override
protected void onActivityResult(int arg0, int arg1, Intent data) {
if(data!=null)
{ Uri uri = data.getData();
Bitmap bitmap = data.getParcelableExtra("data");
baseBitmap = bitmap;
iv.setImageURI(uri); }
super.onActivityResult(arg0, arg1, data);
} public void save(View view)
{
try { File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");
FileOutputStream fos = new FileOutputStream(file);
//保存图片
baseBitmap.compress(CompressFormat.JPEG, 100, fos); Toast.makeText(this, "保存图片成功", 0).show(); //模拟一个消息通知系统sd卡被重新挂载
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
sendBroadcast(intent); } catch (Exception e) {
Toast.makeText(this, "保存图片失败", 0).show();
e.printStackTrace();
} } }

android 简单的画图片的更多相关文章

  1. Android简单逐帧动画Frame的实现(二)

    Android简单逐帧动画Frame的实现   Android简单逐帧动画Frame的实现 1.逐帧动画 即是通过播放预先排序好的图片来实现动态的画面,感觉像是放电影. 2.实现步骤: 1. 在工程里 ...

  2. Android简单文件浏览器源代码 (转)

    Android简单文件浏览器源代码 (转) activity_main .xml <LinearLayout xmlns:android="http://schemas.android ...

  3. Android简单介绍SharedPreference,内部文件,sdcard数据存储

    SharedPreference 以xml的结构储存简单的数据,储存在data/data/程序包名/shared_prefs文件夹中 使用方式 创建对象的方式有三种 Context 的 getShar ...

  4. android简单登陆和注册功能实现+SQLite数据库学习

    最近初学android,做了实验室老师给的基本任务,就是简单的登陆和注册,并能通过SQLite实现登陆,SQlLite是嵌入在安卓设备中的 好了下面是主要代码: 数据库的建立: 这里我只是建立了一个用 ...

  5. Android简单的ListViewDemo及每个控件的点击事件

    ListView是什么? ListView是一个 数据控件,可以展示从数据库中读取的数据.是.net3.5的新控件. 它比gridview更灵活,而且支持多种模板,支持分页. 文章地址 http:// ...

  6. Android简单加密保护自有图片资源

    现在大部分android应用的图片资源,被反编译后就可以直接拿来用,如果不想让自己的图片资源直接被反编译后使用,首先想到的应该是把图片加密.这里笔者抛砖引玉,草草写了一个对图片进行简单加密的方法,希望 ...

  7. Android 简单计算器源码....

    PS:今天算是闲着没事做了一个小型的计算器...顺便熟悉一下Android的布局,组件,以及时间监听的方法...就当是做了一个小小的练习吧...     顺便去对比了一下别人写的代码...有的使用到了 ...

  8. 也发一个自己实现的android简单文件选择器代码。支持多卡,排序

    一个很简单的文件选择器对话框,支持双sd卡,当然前提是要有sd卡..并且实现了排序效果. 只有100多行的代码,基本的思路就是用listview显示目录下的所有子文件,再判断是文件还是目录. 利用Co ...

  9. Android简单计算器

    这是很久之前做的,方法很简单,都是一些基础的,不足的是还有很多功能不够. activity_main.xml布局: <LinearLayout xmlns:android="http: ...

随机推荐

  1. hive web界面管理

    老版本使用 访问<Hive Server Address>:9999/hwi 1.首先下载对应版本的src文件,本机使用apache-hive-1.2.2-src.tar.gz 2.解压缩 ...

  2. [转] python 模块学习 hashlib

    转自: http://www.cnblogs.com/BeginMan/p/3328172.html 一.hashlib概述 涉及加密服务:14. Cryptographic Services 其中 ...

  3. Java微信二次开发(八)

    高级接口,先做了两个(获取用户信息和获取关注者列表) 第一步:找到包com.wtz.vo,新建类UserInfo.java package com.wtz.vo; /** * @author wang ...

  4. Nginx HTTP 过滤addition模块(响应前后追加数据)

    --with-http_addition_module 需要编译进Nginx 其功能主要在响应前或响应后追加内容 add_before_body 指令 将处理给定子请求后返回的文本添加到响应正文之前 ...

  5. ef 问题汇总

    持续更新: 一  属性重命名 数据库:UserName Model: [Column("UserName")]public string UserName222 二, 某表多个外键 ...

  6. day5 算数,比较,赋值,逻辑运算符,表达式

    算数运算符 + 加- 减* 乘/ 除// 整除% 取余** 指数 算数优先级: 指数>乘除>加减 ps:python里面区分优先级只有小括号 () 没有 [] 和 {} , 比较运算符 = ...

  7. [BZOJ5248] 2018九省联考 D1T1 一双木棋 | 博弈论 状压DP

    题面 菲菲和牛牛在一块\(n\)行\(m\)列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束. 落子的规则是:一个格子可以落子 ...

  8. sharepoint 2007页面显示真实的错误信息

    打开下面path的web.config文件:C:\Program Files\Common Files\Microsoft Shared\Web ServerExtensions\12\TEMPLAT ...

  9. AtCoder Grand Contest 010 D - Decrementing

    题目描述 有n个整数,其中第i个数为Ai.这些数字的gcd为1.两人轮流操作,每次操作把一个大于1的数减1,并把所有数除以所有数的最大公约数,最后无法操作者输,求是否先手必胜. 如果当前的sum为偶数 ...

  10. 有趣的async

    在项目的开发过程中,同步异步是一个很重要的概念.但是在js中,又会有稍微的不同. 依据微软的MSDN上的解说: (1) 同步函数:当一个函数是同步执行时,那么当该函数被调用时不会立即返回,直到该函数所 ...