Использование Seek Bar для увеличения Android Canvas
Это мой первый вопрос в stackru. Любая помощь будет очень высоко ценится. Я пытаюсь увеличить холст с помощью панели поиска, поэтому в зависимости от хода выполнения панели поиска холст будет увеличивать и уменьшать масштаб.
Вот мой код в основной деятельности:
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "Seekbar Value : " + progress, Toast.LENGTH_SHORT).show();
CPaintView paint = (CPaintView) this.findViewById(R.id.cPaintView1);
paint.zoomX = (float)progress;
paint.zoomY = (float)progress;
paint.invalidate();
}
тогда он передаст значение прогресса классу CPaintView, который содержит холст:
public class CPaintView extends View implements OnTouchListener {
final Paint paint = new Paint();
int color = Color.parseColor("#FF0000");
Bitmap offScreenBitmap;
Canvas offScreenCanvas;
final int CIRCLE = 0;
final int TRIANGLE = 1;
final int SQUARE = 2;
int shape = CIRCLE;
private int mActivePointerId;
float zoomX = 0;
float zoomY = 0;
public CPaintView(Context context) {
super(context);
setup();
}
public CPaintView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setup();
}
public CPaintView(Context context, AttributeSet attrs) {
super(context, attrs);
setup();
}
public void setup()
{
setOnTouchListener(this); // define event listener and start intercepting events
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
// draw the off screen bitmap
if(zoomX > 0)
{
canvas.save();
canvas.scale(zoomX, zoomY);
canvas.drawBitmap(offScreenBitmap, 0, 0, paint);
canvas.restore();
}
else
canvas.drawBitmap(offScreenBitmap, 0, 0, paint);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
// get the x,y coordinates of the MotionEvent.ACTION_MOVE event
int pointerIndex = 0;
for(int i = 0; i < event.getPointerCount(); i++)
{
mActivePointerId = event.getPointerId(i);
pointerIndex = event.findPointerIndex(mActivePointerId);
float x = event.getX(pointerIndex);
float y = event.getY(pointerIndex);
float y1 = y + 20;
float x2 = x + 20;
float y2 = y1 - 10;
paint.setColor(color);
float verts[] = {x, y, x, y1, x2, y2};
int[] vertsColors = {color, color, color, color, color, color};
switch(shape)
{
case CIRCLE:
offScreenCanvas.drawCircle(x, y, 10, paint); break;// draw a red circle at the x,y coordinates specified by the user
case TRIANGLE:
offScreenCanvas.drawVertices(Canvas.VertexMode.TRIANGLES, verts.length, verts, 0, null, 0, vertsColors, 0, null, 0, 0, paint);break;
case SQUARE:
offScreenCanvas.drawRect(x-10, y-10, x+10, y+10, paint); break;
}
invalidate();
}
return true;
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
// create / re-create the off screen bitmap to capture the state of our drawing
// this operation will reset the user's drawing
offScreenBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
offScreenCanvas = new Canvas(offScreenBitmap);
}
}
У меня проблема с методом onDraw. Проблема в том, что когда я увеличиваю прогресс на панели поиска, весь холст исчезает, и я пытаюсь нарисовать его, кажется, что он не рисует. Но когда я уменьшаю прогресс на панели поиска до 0, все чертежи возвращаются, и я вижу их снова, включая рисунок, который кажется неработающим.
Я прошу прощения за мой плохой английский.
Большое спасибо.
1 ответ
Ваша проблема заключается в том, как работает масштаб. Масштабирование в 0,0 не определено. Масштабирование в 1f,1f является значением по умолчанию. Масштабирование не работает вообще,
if(zoomX > 0)
{
canvas.save();
canvas.scale(zoomX, zoomY);
canvas.drawBitmap(offScreenBitmap, 0, 0, paint);
canvas.restore();
}
else
canvas.drawBitmap(offScreenBitmap, 0, 0, paint);
если масштабирование равно 0, то оно будет правильно рисовать масштабированное растровое изображение. Потому что это пропустит ваш шаг масштабирования. иначе у вас есть масштабирование как 50, которое, по сути, может иметь точечный рисунок. Попытайтесь заставить масштабирование колебаться вокруг 1. Что-то вроде увеличения = 12 / (1 + прогресс) Тогда масштаб может варьироваться от 12х до значений меньше нуля. Ваш рисунок кажется, что он должен быть там, он просто WAAAAY маленький. За исключением нуля, где вы пропустите этот шаг и сделайте его 1.