//布局文件
<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"
tools:context="${relativePackage}.${activityClass}" >
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bg" />
<LinearLayout
android:layout_alignParentBottom="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="red"
android:text="红色"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="green"
android:text="绿色"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="brush"
android:text="刷子"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="save"
android:text="保存"/>
</LinearLayout>
</RelativeLayout>
//MainActivity配置文件
package com.example.demo;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
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.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
public class MainActivity extends Activity {
private int startX;
private int startY;
private Paint paint;
private Canvas canvas;
private ImageView iv;
private Bitmap bmSrc;
private Bitmap bmCopy;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//画一条线测试
bmSrc = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
bmCopy = Bitmap.createBitmap(bmSrc.getWidth(), bmSrc.getHeight(), bmSrc.getConfig());
//画笔
paint = new Paint();
//画板
canvas = new Canvas(bmCopy);
//作画 到此步bmCopy和bmSrc的图片才会一样
canvas.drawBitmap(bmSrc, new Matrix(), paint);
//画一条线
//canvas.drawLine(10, 10, 100, 100, paint);
iv = (ImageView) findViewById(R.id.iv);
iv.setImageBitmap(bmCopy);
iv.setOnTouchListener(new OnTouchListener() {
//手指触摸屏幕,就会产生触摸事件
@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 , newX, newY, paint);
iv.setImageBitmap(bmCopy);
//把本次画线的重点设置为下一次画线的起点
startX = newX;
startY = newY;
break;
//手指离开
case MotionEvent.ACTION_UP:
break;
}
//true表示告诉系统,这个触摸事件由IV处理
//false表示不处理该触摸事件,事件往上传递
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(8);
}
public void save(View v){
/**
* arg0:图片格式
* arg1:压缩质量 0-100
* arg2:输出流,保存的位置
*/
File file = new File("mnt/sdcard/tt2.png");
FileOutputStream fos;
try {
//把图片压缩到本地文件
fos = new FileOutputStream(file);
bmCopy.compress(CompressFormat.PNG, 100, fos);
fos.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//手动发送sd卡就绪广播
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
//无序广播
sendBroadcast(intent);
}
}
//添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
本文介绍如何在Android应用中利用相对布局(RelativeLayout)与事件监听(如触摸事件)来创建一个简单的绘图应用。通过定义一个背景图片、布局组件和事件响应方法,用户可以实现在界面上绘制线条的功能。此外,文章还演示了如何改变线条颜色、粗细以及保存绘制结果到本地文件。本教程适合Android初学者理解布局管理与用户交互的基本概念。
160

被折叠的 条评论
为什么被折叠?



