package net.blogjava.mobile;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import net.blogjava.mobile.ColorPickerDialog.OnColorChangedListener;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BlurMaskFilter;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.EmbossMaskFilter;
import android.graphics.MaskFilter;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Bitmap.CompressFormat;
import android.os.Bundle;
import android.os.Handler;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.ViewGroup.LayoutParams;
import android.widget.PopupWindow;
public class Main extends Activity implements OnColorChangedListener
{
private MyView myView;
private PopupWindow mPopupWindow;
private Path pathmini;
private Paint paint;
private MaskFilter emboss;
private MaskFilter blur;
private DisplayMetrics screen = new DisplayMetrics();
//状态栏+工具栏高度
private int contentTop=0;
int picCount=0;
int xCount = 1;
int yCount = 0;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
myView = new MyView(this);
setContentView(myView);
paint = new Paint();
//抗锯齿
paint.setAntiAlias(true);
//防止抖动
paint.setDither(true);
//设置画笔初始颜色为蓝色
paint.setColor(0xFF0000FF);
//设置初始化画笔类型为画笔
paint.setStyle(Paint.Style.STROKE);
//曲线折角处圆滑
paint.setStrokeJoin(Paint.Join.ROUND);
//曲线起始和结尾笔迹类型为圆形
paint.setStrokeCap(Paint.Cap.ROUND);
//设置画笔初始宽度为6像素
paint.setStrokeWidth(6);
//浮雕效果,参数:指定光源方向,周围环境,高光,高光半径
emboss = new EmbossMaskFilter(new float[]
{ 1, 1, 1 }, 0.4f, 6, 3.5f);
//喷涂效果,参数:半径,类型
blur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL);
}
Handler handler = new Handler();
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();//
//将要显示的popupwindow加入到消息处理中心,先让activity运行起来,然后让popupwindow延迟1秒中显示(不算线程)
handler.postDelayed(new Runnable(){
public void run(){
showPopupTools();
}
}, 1000);
}
//获得画板编辑部分宽和高
public int[] drawboard_screen(){
Log.d("catch_screen",""+contentTop);
screen = new DisplayMetrics();
//获得屏幕宽和高
getWindowManager().getDefaultDisplay().getMetrics(screen);
int src[] = new int[2];
src[0] = screen.widthPixels;
src[1] = screen.heightPixels;
return src;
}
//获得画布的高度的起点(状态栏高度+标题栏高度)
/*public int catch_StatusBarHeight(){
int contentTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();
return contentTop;
}*/
//显示画板工具条
public void showPopupTools()
{
contentTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();
Log.d("showPopupTools", ""+contentTop);
Context mContext = Main.this;
LayoutInflater mLayoutInflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
View popunwindwow = mLayoutInflater.inflate(R.layout.popupwindow, null);
mPopupWindow= new PopupWindow(popunwindwow,LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
//显示工具栏在当前屏幕位置。左起点为0,contentTop屏幕上起点(去掉状态栏和标题栏的位置)
mPopupWindow.showAtLocation(myView, Gravity.TOP|Gravity.LEFT, 0, contentTop+5);
}
//改变画笔颜色
public void colorChanged(int color)
{
paint.setColor(color);
}
public class MyView extends View
{
private Bitmap bitmapDraw;
private Bitmap mixBitmap;
private Canvas canvas;
private Path path;
private Paint bitmapPaint;
private Matrix matrix;
private float mX, mY;
private int drawBoard[] = drawboard_screen();
private int drawBoardWidth = drawBoard[0];
private int drawBoardHeight = drawBoard[1];
public void loadBitmap()
{
//创建一个新画布,画布宽度为屏幕宽度,高度为
bitmapDraw = Bitmap.createBitmap(drawBoardWidth,drawBoardHeight, Bitmap.Config.ARGB_8888);
Log.d("bmpscreen", ""+drawBoardWidth);
Log.d("bmpscreen", ""+drawBoardHeight);
//将bitmap放在canvas上,在bitmap1上画图
canvas = new Canvas(bitmapDraw);
//设置图片背景为白色
canvas.drawColor(Color.WHITE);
}
public MyView(Context c)
{
super(c);
loadBitmap();
bitmapPaint = new Paint(Paint.DITHER_FLAG);
path = new Path();
pathmini= new Path();
}
public void clear()
{
loadBitmap();
invalidate();
}
public void clearMemery(Bitmap bitmap){
// 销毁时调用
if(bitmap != null && !bitmap.isRecycled()){
bitmap.recycle();
bitmap = null;
}
}
//保存拼接后的图片
private void save_Pic(int picCount){
if(picCount%3 != 1){
xCount++;
}else{
xCount = 1;
yCount++;
}
Log.d("xCount+yCount", ""+xCount+"======"+yCount);
if(picCount<=3){
mixBitmap = Bitmap.createBitmap(drawBoardWidth*xCount,drawBoardHeight*yCount,Bitmap.Config.ARGB_8888);
}
else{
mixBitmap = Bitmap.createBitmap(drawBoardWidth*3,drawBoardHeight*yCount,Bitmap.Config.ARGB_8888);
}
canvas = new Canvas(mixBitmap);
try {
if(picCount>1){
FileInputStream fisImage = new FileInputStream("/sdcard/image.png");
Bitmap picImage = BitmapFactory.decodeStream(fisImage);
canvas.drawBitmap(picImage, 0,0,null);
fisImage.close();
clearMemery(mixBitmap);
}
FileInputStream fisTemp = new FileInputStream("/sdcard/temp.png");
Bitmap picTemp = BitmapFactory.decodeStream(fisTemp);
canvas.drawBitmap(picTemp, drawBoardWidth*(xCount-1),drawBoardHeight*(yCount-1) ,null);
Log.d("写入X", ""+(drawBoardHeight*(xCount-1)));
Log.d("写入y", ""+(drawBoardHeight*(yCount-1)));
FileOutputStream fos = new FileOutputStream("/sdcard/image.png");
mixBitmap.compress(CompressFormat.PNG, 100, fos);
fisTemp.close();
fos.close();
clearMemery(picTemp);
clearMemery(mixBitmap);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected void onDraw(Canvas canvas)
{
//绘制图像
canvas.drawBitmap(bitmapDraw, 0, 0, bitmapPaint);
//绘制图形(画笔经过的点组成的路径)
canvas.drawPath(path, paint);
/* canvas.save( Canvas.ALL_SAVE_FLAG );//保存
//store
canvas.restore();//存储
*/ }
//画笔起点位置(上一个点)
private void touch_start(float x, float y)
{
path.moveTo(x, y);
pathmini.moveTo(x/2, y/2);
mX = x;
mY = y;
}
//画笔移动偏移量位置(下一个点)
private void touch_move(float x, float y)
{
float dx = Math.abs(x - mX);
float dy = Math.abs(y - mY);
if(dx!=0 && dy!=0)
{
//设置亮点间的中间点,(x+mX)/2贝塞尔曲线,似的曲线更圆滑
path.quadTo(mX, mY, (x+mX)/2, (y+mY)/2);
pathmini.quadTo(mX/2, mY/2, (x+mX)/4, (y+mY)/4);
}
mX = x;
mY = y;
}
//画笔画线结束时的处理,将所有路径压缩1/2后保存到临时图片中
private void touch_up()
{
Log.d("touch_up", ""+contentTop);
//一条线的路径
canvas.drawPath(path, paint);
path.reset();
try
{
//定义矩阵对象
matrix=new Matrix();
//定义一个矩阵是原来矩阵的1/2
matrix.postScale(0.5f, 0.5f);
//将原图片的宽和高缩小为原来的1/2(每张图片
没有合适的资源?快使用搜索试试~ 我知道了~
android简单的画图板实现代码
共40个文件
class:16个
png:8个
java:5个
4星 · 超过85%的资源 需积分: 50 667 下载量 101 浏览量
2012-04-23
22:55:26
上传
评论 8
收藏 647KB RAR 举报
温馨提示
这是一款android的画图板实现代码,基本功能齐全,适合初学者开发的例子程序。
资源推荐
资源详情
资源评论
收起资源包目录
画图板.rar (40个子文件)
ch10_paint
.project 846B
src
net
blogjava
mobile
HecACT.java 1KB
PathInfo.java 493B
ColorPickerDialog.java 8KB
Main1.java 11KB
AndroidManifest.xml 746B
res
drawable
next.png 9KB
icon.png 3KB
close.png 38KB
pen.png 49KB
close1.png 5KB
eraser.png 9KB
forbid.png 15KB
color.png 75KB
layout
main1.xml 412B
popupwindow.xml 1KB
values
strings.xml 160B
.settings
org.eclipse.jdt.core.prefs 629B
assets
gen
net
blogjava
mobile
R.java 1KB
default.properties 449B
.classpath 280B
bin
resources.ap_ 201KB
net
blogjava
mobile
R$layout.class 432B
ColorPickerDialog.class 2KB
R$drawable.class 606B
R$attr.class 343B
PathInfo.class 837B
Main.class 7KB
HecACT$myView.class 673B
HecACT.class 853B
Main$1.class 610B
R$id.class 632B
Main$MyView.class 6KB
R.class 538B
R$string.class 430B
ColorPickerDialog$1.class 973B
ColorPickerDialog$ColorPickerView.class 5KB
ColorPickerDialog$OnColorChangedListener.class 287B
classes.dex 18KB
ch10_paint.apk 213KB
共 40 条
- 1
Uno2
- 粉丝: 8
- 资源: 14
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
- 6
前往页