画板
今天学了画板,主要是三个部分(Color,Paint,Canvas),即(颜色,画笔,画布)。
下面是我今天做的简易画板:
具体代码的实现,我是在现有的代码上进行修改实现的。原来的代码只能够画一笔,之后画就会刷新原来画的东西,而我大致实现了以下新增加的功能
连续不断的画:
原来的代码为每次是新建立的的存放点的数组,所以我改成用一个数组来存放点,即
private ArrayList<Point> pointall=new ArrayList<Point>();
但是,光改这一个,会导致所有的点都连成一条线,故我对onDraw函数进行了改写,改完后的代码如下(在鼠标点击的时候,加入一个(0,0)的点来作为标记,判断是不是另外一笔):
protected void onDraw(Canvas canvas){
if(pointall.size()>1){
Iterator<Point> iter=pointall.iterator();// 取出存放点的数组
Point first=null;
Point last=null;
while(iter.hasNext()){
if(first==null){
while(iter.hasNext()){ //取得一个非(0,0)的线的开头
first=(Point)iter.next();
if(first.x!=0||first.y!=0) break;
}
}
else{
if(last!=null){
first=last; //将下一个坐标点赋给上面的
}
last=(Point)iter.next(); //取得下一个点
if(last.x==0&&last.y==0){ //判断
while(iter.hasNext()){
first=(Point)iter.next();
if(first.x!=0||first.y!=0) break;
}
if(iter.hasNext()){
last=(Point)iter.next();
}
else break;
}
canvas.drawLine(first.x, first.y, last.x, last.y,pa);
}
}
}
}
代码虽然简单,但是在编写的时候还是遇到了各种错误,有时候会死机,有时候会将(0,0)和其他点连成一条直线,等等......现在这个代码,是大致还算可以的
修改画笔的颜色和大小:
目前做的是可以改颜色和大小的,但是一改,以前画的也会改变,这个是因为代码中用的是重构,即重新画,而不是在现有的画上添加,而在重新画的时候,是以你现在的颜色和大小来画的,会丢失前面的颜色和大小这些信息,如果要解决,则要新建一些空间来存放这些信息,比如类和数组,之后在根据这些信息来画,这样就不会改变以前的画的了,但是目前水平还一点欠缺,没有完成,现在只能统一改变颜色和大小,下面是这部分的代码:
public static void change_big(String string) {
pa.setStrokeWidth(Integer.parseInt(string)); //修改画笔大小的函数(pa是我定义为全局变量的画笔)
}
static public void change(String a) {
if(a.equals("BLACK")) pa.setColor(Color.BLACK); //修改画笔颜色的函数
if(a.equals("DKGRAY")) pa.setColor(Color.DKGRAY);
if(a.equals("GRAY")) pa.setColor(Color.GRAY);
if(a.equals("LTGRAY")) pa.setColor(Color.LTGRAY);
if(a.equals("RED")) pa.setColor(Color.RED);
pa.setStrokeWidth(22);
}
//绑定多选框和与其对应的函数--------颜色
Spinner spinner = (Spinner) findViewById(R.id.spinner2);
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view,
int pos, long id) {
String[] languages = getResources().getStringArray(R.array.languages);
Toast.makeText(draw_main.this, "你点击的是:"+languages[pos], 2000).show();
draw.change(languages[pos]);
}
public void onNothingSelected(AdapterView<?> parent) {
}
}
);
//绑定多选框和与其对应的函数--------大小
Spinner big = (Spinner) findViewById(R.id.spinner1);
big.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view,
int pos, long id) {
String[] big = getResources().getStringArray(R.array.big);
Toast.makeText(draw_main.this, "你点击的是:"+big[pos], 2000).show();
draw.change_big(big[pos]);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// Another interface callback
}
}
);
除此之外,我还用到了多选框的一些东西(样式很丑,但不知道怎么改)(虽然简单,但还是记录一下):
多选框:
<Spinner
android:id="@+id/spinner1" //id
android:layout_width="90dp"
android:layout_height="50dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="100dp" //控制位置的
android:entries="@array/big" //对应存放数据的位置
/>
存放数据,在res--values下面,可以自己建立一个新的xml来存放:
<string-array name="big"> //名称,要和前面对应
<item>10</item> //数据(字符串格式)
<item>20 </item>
<item>30</item>
<item>40</item>
<item>50</item>
</string-array>
ps:刚刚遇到的不能不同线条不同颜色和粗细的问题,已经找到解决方法了,
思路:因为颜色和粗细也i是int类型的,所以可以再加一个点来存储该信息,不过要注意类型的转换和大小!!!
具体见
http://sixsixccff.iteye.com/blog/2382143