2013-08-29 35 views
2

我有以下的,我在我的應用程序中使用繪畫CustomView什麼:改變顏色,而不會影響之前繪製的

package com.test.testing; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.graphics.Paint.Style; 
import android.view.MotionEvent; 
import android.widget.TextView; 

public class CustomView extends TextView { 
    Paint paint; 
    Path path; 
    float x = 0; 
    float y = 0; 
    private int cWhite = Color.WHITE; 

    public CustomView(Context context) { 
     super(context); 
     paint = new Paint(); 
     path= new Path(); 
     paint.setAlpha(255); 
     paint.setColor(cWhite); 
     paint.setStyle(Style.STROKE); 
     paint.setStrokeWidth(20); 
    } 

    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     canvas.drawPath(path,paint); 
     canvas.drawCircle(x, y, 10, paint); 
    } 

    public boolean onTouchEvent(MotionEvent event) { 
     int action = event.getAction(); 
     switch (action) { 
     case MotionEvent.ACTION_DOWN: 
      path.moveTo(event.getX(), event.getY()); 
      path.lineTo(event.getX(), event.getY()); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      x = event.getX(); 
      y = event.getY(); 
      path.lineTo(x, y); 
      invalidate(); 
      break; 
     case MotionEvent.ACTION_UP: 
      path.lineTo(event.getX(), event.getY()); 
      break; 
     case MotionEvent.ACTION_CANCEL: 
      break; 
     default: 
      break; 
     } 
     return true; 
    } 
} 

我設置一個FrameLayout這使畫布在我的XML繪圖:

<FrameLayout 
    android:id="@+id/viewd" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="3" 
    android:orientation="vertical" > 
</FrameLayout> 

我打電話給我的Activity內獲得視圖以使用戶能夠借鑑:

layout = (FrameLayout)findViewById(R.id.viewd); 
//layout.removeAllViews(); 
view = new CustomView(Activity.this); 
view.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT)); 
layout.addView(view); 

我有不同的顏色選項,用戶可以從中選擇改變我的Activity內的Dialog繪畫描邊顏色:

public void colorHandle() { 
    // custom dialog 
    final Dialog dialog = new Dialog(this); 
    dialog.setContentView(R.layout.colorlayout); 
    dialog.setTitle("Choose a Drawing Color"); 

    Button btnWH = (Button) dialog.findViewById(R.id.btnWhite); 
    Button btnBL = (Button) dialog.findViewById(R.id.btnBlack); 
    Button btnBLU = (Button) dialog.findViewById(R.id.btnBlue); 
    Button btnCY = (Button) dialog.findViewById(R.id.btnCyan); 
    Button btnDG = (Button) dialog.findViewById(R.id.btnDkGray); 
    Button btnGR = (Button) dialog.findViewById(R.id.btnGray); 
    Button btnGRE = (Button) dialog.findViewById(R.id.btnGreen); 
    Button btnLG = (Button) dialog.findViewById(R.id.btnLtGray); 
    Button btnMG = (Button) dialog.findViewById(R.id.btnMagenta); 
    Button btnRD = (Button) dialog.findViewById(R.id.btnRed); 
    Button btnYE = (Button) dialog.findViewById(R.id.btnYellow); 

    if (btnWH != null) { 
     btnWH.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       view.paint.setColor(Color.WHITE); 
       dialog.dismiss(); 
      } 
     }); 
    } 
    if (btnBL != null) { 
     btnBL.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       view.paint.setColor(Color.BLACK); 
       dialog.dismiss(); 
      } 
     }); 
    } 
    if (btnBLU != null) { 
     btnBLU.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       view.paint.setColor(Color.BLUE); 
       dialog.dismiss(); 
      } 
     }); 
    } 
    if (btnCY != null) { 
     btnCY.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       view.paint.setColor(Color.CYAN); 
       dialog.dismiss(); 
      } 
     }); 
    } 
    if (btnDG != null) { 
     btnDG.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       view.paint.setColor(Color.DKGRAY); 
       dialog.dismiss(); 
      } 
     }); 
    } 
    if (btnGR != null) { 
     btnGR.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       view.paint.setColor(Color.GRAY); 
       dialog.dismiss(); 
      } 
     }); 
    } 
    if (btnGRE != null) { 
     btnGRE.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       view.paint.setColor(Color.GREEN); 
       dialog.dismiss(); 
      } 
     }); 
    } 
    if (btnLG != null) { 
     btnLG.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       view.paint.setColor(Color.LTGRAY); 
       dialog.dismiss(); 
      } 
     }); 
    } 
    if (btnMG != null) { 
     btnMG.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       view.paint.setColor(Color.MAGENTA); 
       dialog.dismiss(); 
      } 
     }); 
    } 
    if (btnRD != null) { 
     btnRD.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       view.paint.setColor(Color.RED); 
       dialog.dismiss(); 
      } 
     }); 
    } 
    if (btnYE != null) { 
     btnYE.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       view.paint.setColor(Color.YELLOW); 
       dialog.dismiss(); 
      } 
     }); 
    } 
    dialog.show(); 
} 

一切工作正常,除了每次我選擇了新的顏色,任何事情以前也畫更改爲新選擇的顏色。無論接下來選擇何種新顏色,我如何保留以前不變的任何東西?

+0

在onDraw函數中,您可以嘗試設置canvas = new Canvas(); – jaesanx

+0

沒有工作。它甚至不啓動Draw方法。 – Si8

+1

您正在更改顏色,但重新繪製所有內容。你需要做的是分別存儲已經繪製的內容。然後每次都將其複製,並在頂部添加。 – Doomsknight

回答

4

您正在將每個TouchEvent添加到單個路徑。然後使用Paint的顏色的當前值繪製Path。這就是爲什麼你看到一切都以單一顏色繪製的原因。 您需要爲每個顏色更改創建一個單獨的路徑和顏色,然後依次繪製它們,更改每個drawPath()調用的Paint的顏色

我不這麼認爲。打破路徑並不壞。

List<Pair<Path, Integer>> path_color_list = new ArrayList<Pair<Path,Integer>>() 

然後每次更改顏色。取當前路徑和view.paint.getColor並將其保存到列表中。

path_color_list.add(new Pair.create(path, view.paint.getColor()); 
path = new Path(); 

然後在您的平局()通過path_color_list迭代,每次

for (Pair<Path,Integer> path_clr : path_color_list){ 
    paint.setColor(path_clr.second); 
    canvas.drawPath(path_clr.first, paint); 
} 

跟着一起過去drawPath(),您有

+0

Will Canvas = new Canvas();作爲其他用途提到的伎倆? – Si8

+1

我不這麼認爲。打破路徑並不壞。 – dangVarmit

+0

我的應用程序是FC。我應該修改我的Paint類嗎? – Si8

3

只需做一件事設置新的漆色總是創建你的view類的新實例view1.paint.setColor(Color.LTGRAY);, 然後layout.addView(view1);意味着創建新的視圖,它將保存prevoius一個, 其工作對我來說。很簡單!!

相關問題