Изменения размеров View
Я делаю приложение на Android, в котором пользователю нужно задать размеры битмапа, который мне нужно создать. Так как размеры могут быть больше размера экрана, то мой файл xml разметки имеет следующий вид:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scroll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scrollbars="vertical" >
<HorizontalScrollView
android:id="@+id/scroll_hor"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scrollbars="horizontal">
<com.painter.editor.PainterView
android:id="@+id/painter_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#FFFFFF"
android:isScrollContainer="true"/>
</HorizontalScrollView>
</ScrollView>
Получается после начала работы програмы, я хочу изменить размер моего PaiterView.
package com.painter.editor;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
public class PainterView extends View {
private Bitmap bitmap;
private Canvas canvas;
private Paint paint;
public boolean isDrawing;
public PainterView(Context context, AttributeSet attrs) {
super(context, attrs);
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
}
@Override
public void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
isDrawing = true;
bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
canvas = new Canvas(bitmap);
draw(canvas);
}
@Override
public void onDraw(Canvas canvas) {
canvas.drawBitmap(bitmap, 0, 0, paint);
}
}
Буду рад любой помощи!
Ответы (1 шт):
Автор решения: Style-7
→ Ссылка
Для установки размера Custom View нужно переопределить метод onMeasure в котором вызвать метод setMeasuredDimension. Для запроса изменения размера нужно вызвать метод requestLayout().
Тестовый пример. Custom View:
public class ViewResizeable extends View{
int bitmap_dx, bitmap_dy;
public ViewResizeable( Context context, AttributeSet attrs ){
super( context, attrs );
}
public void setSize( int dx, int dy ){
bitmap_dx = dx;
bitmap_dy = dy;
}
@Override
protected void onDraw( Canvas canvas ){
super.onDraw( canvas );
int text_size = 30;
Paint paint = new Paint( Paint.ANTI_ALIAS_FLAG );
paint.setTextSize( text_size );
paint.setColor( 0xffffffff );
canvas.drawColor( 0xff0080ff );
canvas.drawText( "w/h: "+canvas.getWidth()+"/"+canvas.getHeight(), 0, text_size, paint );
}
@Override
protected void onMeasure( int widthMeasureSpec, int heightMeasureSpec ){
super.onMeasure( widthMeasureSpec, heightMeasureSpec );
setMeasuredDimension( bitmap_dx, bitmap_dy);
}
}
Разметка активности:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<com.mypack.ViewResizeable
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/cutom_view"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="bottom"
>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/dx"
android:inputType="numberDecimal"
android:hint="DX"
/>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/dy"
android:inputType="numberDecimal"
android:hint="DY"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="change size"
android:onClick="onClick"/>
</LinearLayout>
</FrameLayout>
Активность:
public class Main extends Activity{
ViewResizeable custom_view;
@Override
protected void onCreate( Bundle savedInstanceState ){
super.onCreate( savedInstanceState );
setContentView( R.layout.test );
custom_view = findViewById( R.id.cutom_view );
custom_view.setSize( 512, 256 );
}
}
public void onClick( View view ){
int dx = Integer.parseInt( ((EditText)findViewById( R.id.dx )).getText().toString() );
int dy = Integer.parseInt( ((EditText)findViewById( R.id.dy )).getText().toString() );
custom_view.setSize( dx, dy );
custom_view.requestLayout();
}
}