如何在 运行 时间更改自定义视图中的参数?
How to change to parameter in custom view at run time?
我正在开发绘图板应用程序。我已经通过这样的自定义视图完成了绘制功能:
public class DrawView extends View implements OnTouchListener {
private Paint bmPaint = new Paint();
private Paint drawPaint = new Paint();
private Path path = new Path();
private Canvas cv = null;
private Bitmap bm = null;
private Drawable d;
private boolean firstTimeThru = true;
public DrawView(Context context) {
super(context);
init(context);
}
public DrawView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public void init(Context ctx) {
setFocusable(true);
setFocusableInTouchMode(true);
this.setOnTouchListener(this);
}
@Override
public void onDraw(Canvas canvas) {
// Set everything up the first time anything gets drawn:
if (firstTimeThru) {
firstTimeThru = false;
//d = getResources().getDrawable(R.drawable.zone0_over);
d = new ColorDrawable(Color.TRANSPARENT);
// Just quickly fill the view with a red mask:
canvas.drawColor(Color.TRANSPARENT);
// Create a new bitmap and canvas and fill it with a red mask:
bm = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(),Config.ARGB_8888);
cv = new Canvas();
cv.setBitmap(bm);
d.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
d.draw(cv);
// Specify that painting will be with fat strokes:
drawPaint.setStyle(Paint.Style.STROKE);
drawPaint.setColor(Color.RED);
drawPaint.setStrokeWidth(canvas.getWidth() / 200); // default 15
// Specify that painting will clear the pixels instead of paining new ones:
drawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.ADD));
}
cv.drawPath(path, drawPaint);
canvas.drawBitmap(bm, 0, 0, bmPaint);
super.onDraw(canvas);
}
public boolean onTouch(View view, MotionEvent event) {
float xPos = event.getX();
float yPos = event.getY();
switch (event.getAction()) {
// Set the starting position of a new line:
case MotionEvent.ACTION_DOWN:
path.moveTo(xPos, yPos);
invalidate();
return true;
// Draw a line to the ending position:
case MotionEvent.ACTION_MOVE:
path.lineTo(xPos, yPos);
invalidate();
break;
case MotionEvent.ACTION_UP:
break;
default:
return false;
}
return true;
}
}
而 xml 是这样的:
<ImageView
android:id="@+id/change_color_btn"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<com.myapp.tool.DrawView
android:id="@+id/draw"
android:layout_width="match_parent"
android:layout_height="match_parent" />
注意我在onDraw函数里面设置了线宽和线色,目前是红色,但是我想按一个按钮把颜色改成黄色,这个参数怎么设置在 运行 时间内?
谢谢
在您的布局中添加一个用于切换颜色的按钮,并向其添加一个点击监听器。然后你可以改变你的路径的颜色。您是希望当前路径切换颜色还是只切换新路径?
给DrawView添加成员变量和setter函数class:
private int mLineColor = Color.RED;
public void setLineColor(int color)
{
mLineColor = color;
drawPaint.setColor(mLineColor);
}
更改您的 onDraw 以使用它:
drawPaint.setColor(mLineColor);
然后您可以从使用自定义 class 的 Activity 设置它,在 Button onClick() 处理程序中:
DrawView drawview = (DrawView)findViewById(R.id.draw);
drawView.setLineColor(Color.YELLOW);
drawView.invalidate(); // trigger a redraw
对笔画宽度做同样的事情。
在自定义视图中取一个field
值,如mColor
,并为字段值创建setter and getter
,然后在创建自定义视图后设置颜色也是这样:
private int mColor;
public int getmColor() {
return mColor;
}
public void setmColor(int mColor) {
this.mColor = mColor;
this.invalidate();
}
我正在开发绘图板应用程序。我已经通过这样的自定义视图完成了绘制功能:
public class DrawView extends View implements OnTouchListener {
private Paint bmPaint = new Paint();
private Paint drawPaint = new Paint();
private Path path = new Path();
private Canvas cv = null;
private Bitmap bm = null;
private Drawable d;
private boolean firstTimeThru = true;
public DrawView(Context context) {
super(context);
init(context);
}
public DrawView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public void init(Context ctx) {
setFocusable(true);
setFocusableInTouchMode(true);
this.setOnTouchListener(this);
}
@Override
public void onDraw(Canvas canvas) {
// Set everything up the first time anything gets drawn:
if (firstTimeThru) {
firstTimeThru = false;
//d = getResources().getDrawable(R.drawable.zone0_over);
d = new ColorDrawable(Color.TRANSPARENT);
// Just quickly fill the view with a red mask:
canvas.drawColor(Color.TRANSPARENT);
// Create a new bitmap and canvas and fill it with a red mask:
bm = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(),Config.ARGB_8888);
cv = new Canvas();
cv.setBitmap(bm);
d.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
d.draw(cv);
// Specify that painting will be with fat strokes:
drawPaint.setStyle(Paint.Style.STROKE);
drawPaint.setColor(Color.RED);
drawPaint.setStrokeWidth(canvas.getWidth() / 200); // default 15
// Specify that painting will clear the pixels instead of paining new ones:
drawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.ADD));
}
cv.drawPath(path, drawPaint);
canvas.drawBitmap(bm, 0, 0, bmPaint);
super.onDraw(canvas);
}
public boolean onTouch(View view, MotionEvent event) {
float xPos = event.getX();
float yPos = event.getY();
switch (event.getAction()) {
// Set the starting position of a new line:
case MotionEvent.ACTION_DOWN:
path.moveTo(xPos, yPos);
invalidate();
return true;
// Draw a line to the ending position:
case MotionEvent.ACTION_MOVE:
path.lineTo(xPos, yPos);
invalidate();
break;
case MotionEvent.ACTION_UP:
break;
default:
return false;
}
return true;
}
}
而 xml 是这样的:
<ImageView
android:id="@+id/change_color_btn"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<com.myapp.tool.DrawView
android:id="@+id/draw"
android:layout_width="match_parent"
android:layout_height="match_parent" />
注意我在onDraw函数里面设置了线宽和线色,目前是红色,但是我想按一个按钮把颜色改成黄色,这个参数怎么设置在 运行 时间内?
谢谢
在您的布局中添加一个用于切换颜色的按钮,并向其添加一个点击监听器。然后你可以改变你的路径的颜色。您是希望当前路径切换颜色还是只切换新路径?
给DrawView添加成员变量和setter函数class:
private int mLineColor = Color.RED;
public void setLineColor(int color)
{
mLineColor = color;
drawPaint.setColor(mLineColor);
}
更改您的 onDraw 以使用它:
drawPaint.setColor(mLineColor);
然后您可以从使用自定义 class 的 Activity 设置它,在 Button onClick() 处理程序中:
DrawView drawview = (DrawView)findViewById(R.id.draw);
drawView.setLineColor(Color.YELLOW);
drawView.invalidate(); // trigger a redraw
对笔画宽度做同样的事情。
在自定义视图中取一个field
值,如mColor
,并为字段值创建setter and getter
,然后在创建自定义视图后设置颜色也是这样:
private int mColor;
public int getmColor() {
return mColor;
}
public void setmColor(int mColor) {
this.mColor = mColor;
this.invalidate();
}