我的这个小画板功能有两个方面:改变画笔的颜色和改变画笔的粗细。至于如何实现改变画笔的颜色,我的设想是先通过几个小按钮来控制画笔的颜色,这样我们就可以知道如何在我们编写的画板组件内的线条颜色。之后再改变换画笔颜色的方式(采用拖动条等)。对于画笔的粗细,我是通过一个输入框加一个按钮来确定的。最终的效果如下图:
一、DrewView类;
这个类是继承View类。其中开放了两个方法,changecolor()和changewidth()。这两个函数分别用于改变画笔的颜色和粗细。
package com.example.study; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Point; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; @SuppressLint("ClickableViewAccessibility") public class Drawview extends View{ private List<Point> pointall=new ArrayList<Point>(); int color; float width; public Drawview(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub super.setBackgroundColor(Color.WHITE); super.setOnTouchListener(new Touch()); color=Color.BLACK; } public void changecolor(int color)//修改画笔的颜色 { this.color=color; } public void changewidth(float width)//修改画笔的粗细 { this.width=width; } private class Touch implements OnTouchListener{ @Override public boolean onTouch(View v, MotionEvent e) { // TODO Auto-generated method stub Point p=new Point((int)e.getX(),(int)e.getY()); if(e.getAction()==e.ACTION_DOWN){ //当按下 pointall=new ArrayList<Point>(); pointall.add(p); } else if(e.getAction()==e.ACTION_UP){//当抬起 pointall.add(p); Drawview.this.postInvalidate(); //重绘 } else if(e.getAction()==e.ACTION_MOVE){ pointall.add(p); //移动时候 Drawview.this.postInvalidate(); //重绘 } return true; } } protected void onDraw(Canvas canvas){ Paint p=new Paint(); p.setColor(color);//定义颜色 p.setStrokeWidth(width); if(pointall.size()>1){ Iterator<Point> iter=pointall.iterator();// 现在有坐标点保存的时候可以开始进行绘图 Point first=null; Point last=null; while(iter.hasNext()){ if(first==null){ first=(Point)iter.next(); } else{ if(last!=null){ first=last; //将下一个坐标点赋给上面的 } last=(Point)iter.next(); //不停下指 canvas.drawLine(first.x, first.y, last.x, last.y,p); } } } } }
二、activity_home.xml
这是画板的页面,这里面使用了前面我们新建的drewview类(这是因为drewview是是继承view类的,所以和TextView等使用方法相同)。
<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="com.example.study.Home12" > <LinearLayout android:id="@+id/linearLayout1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="34dp" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="您所选的颜色:" /> <TextView android:id="@+id/test" android:layout_width="50dp" android:layout_height="fill_parent" /> <Button android:id="@+id/standard_color" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="chose_color" android:text="选择标准颜色" /> </LinearLayout> <SeekBar android:id="@+id/seekBar1" android:layout_width="match_parent" android:layout_height="wrap_content" android:max="16777215" android:progress="0" /> <LinearLayout android:id="@+id/linearLayout2" android:layout_below="@id/linearLayout1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="34dp" > <EditText android:id="@+id/width" android:layout_width="200dp" android:layout_height="wrap_content" android:inputType="numberDecimal" android:text="1.0" /> <Button android:id="@+id/changewidth" android:text="@string/width" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="width" android:textSize="12sp" /> </LinearLayout> <com.example.study.Drawview android:id="@+id/paintview" android:layout_width="fill_parent" android:layout_height="500dp" android:layout_below="@id/linearLayout2" /> </RelativeLayout>
三、home12.java
这是和activity_home.xml相匹配的activity。
package com.example.study; import com.example.study.Drawview; import com.example.study.R; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.EditText; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; import android.widget.Toast; public class Home12 extends Activity { Drawview dv=null;//用来存放画布视图变量 EditText wid=null; SeekBar sb=null; TextView test=null; int color=0x00000000; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); dv=(Drawview)super.findViewById(R.id.paintview);//获取画布视图 wid=(EditText)super.findViewById(R.id.width);//获取输入的画笔宽度值 sb=(SeekBar)super.findViewById(R.id.seekBar1);//获取拖动条视图 sb.setOnSeekBarChangeListener(new seekbar());//为拖动条视图添加监听 //test=(TextView)super.findViewById(R.id.test); } private class seekbar implements OnSeekBarChangeListener { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // TODO Auto-generated method stub dv.changecolor(progress+0xff000000); test.setBackgroundColor(progress+0xff000000); } @Override public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } @Override public void onStopTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.home, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } public void width(View view) { float width; if(wid.getText()!=null) { width=Float.parseFloat(wid.getText().toString().trim()); dv.changewidth(width); } } public void chose_color(View view) { String[] items={"黑色","红色","绿色","蓝色"}; AlertDialog.Builder builder=new AlertDialog.Builder(this); builder.setTitle("选择标准颜色"); builder.setIcon(R.drawable.ic_launcher); builder.setItems(items, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub int color=0x000000; switch(which) { case 0: color=0; break; case 1: color=16711680; break; case 2: color=65280; break; case 3: color=255; break; } dv.changecolor(color+0xff000000); test.setBackgroundColor(color+0xff000000); sb.setProgress(color); Toast t=Toast.makeText(Home12.this, "color is:"+color, Toast.LENGTH_SHORT); t.show(); } }); builder.setPositiveButton("yes", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }); builder.setNeutralButton("temp2", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }); builder.setNegativeButton("no", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }); //setPositiveButton(builder); builder.show(); } }
相关推荐
在Android开发中,创建一个简易画板(PaintOnTouchEvent)是一项常见的需求,它涉及到自定义View、触摸事件处理以及用户交互的设计。这个项目的核心在于如何有效地处理OnTouchEvent,以实现用户在屏幕上绘制图形的...
在Android开发中,创建一个简易画板应用是一个常见的练习,它可以帮助开发者深入理解自定义View的概念和绘图机制。这个源码项目就是基于这样的目的,使用了Android的自定义View来构建一个基本的画板功能,让用户可以...
在Android开发中,创建一个简易的画板是一个常见的需求,比如用于绘图应用或教育类应用。本教程将深入探讨如何使用简短的代码在Android平台上实现一个基本的画板功能。我们将主要关注以下几个关键知识点: 1. **...
在Android平台上,开发一个简易的绘图板是一个常见的需求,特别是在构建教育、创意或娱乐类应用时。这个“android之简易绘图板”项目显然旨在提供一个基础的绘画功能,让用户能够在屏幕上自由绘制图形和线条。然而,...
在移动设备上实现一个简易画板是许多开发者和学习者早期接触编程时的常见项目。...通过这个项目,初学者不仅可以学习到基本的Android开发知识,还能锻炼解决问题的能力,为进一步深入Android开发打下坚实基础。
9. **跨平台兼容性**:考虑到不同设备和操作系统,"my app"可能需要适配iOS、Android、Windows或MacOS等平台,这涉及多平台开发技术和兼容性测试。 10. **用户体验和反馈**:优秀的应用程序不仅要有强大的功能,还...
在Android平台上,开发一款"小画板程序"是一项有趣且具有挑战性的任务,它涉及到许多核心的Android开发技术。这个程序通常会包含一个用户界面,让用户可以自由绘画、选择颜色、擦除等内容,类似于手机上的简易绘图...
在Android平台上,开发一个简易画图工具是一项常见的任务,它能提供给用户一个自由创作的空间。这个特定的项目,"android简易画图工具",是一个基于Android编程的画板应用,开发者对原有的代码进行了更新和优化,...
Qt是开源的,可以在Windows、Linux、macOS、Android和iOS等多个平台上运行。 2. **QPainter**:在Qt中,QPainter类是用于2D图形绘制的核心组件。它可以用于窗口、图片、打印机等多种输出设备。QPainter提供了丰富的...
【Android小画笔程序】是Android开发中一个有趣的实践项目,它允许用户在屏幕上自由绘画,类似于一个简易的画板应用。实现这个功能主要涉及到以下几个关键知识点: 1. **SurfaceView**: - `SurfaceView`是Android...
在Android开发中,Canvas是用于在屏幕上绘制图形的重要工具,它是Android SDK的一部分,属于View类的成员。本项目"Canvas_draw.zip"显然是一款基于Android Studio的简易画板应用,允许用户进行自由绘画,并能保存...
在这个特定的项目中,开发者创造了一个功能丰富的简易画板应用,旨在提供一个轻松、有趣的绘画体验。 首先,应用提供了不同大小的笔尖供用户选择,这是绘画应用中常见的功能,可以根据个人需求调整线条的粗细,增加...