我试图在ImageView上绘图(就像一个简单的油漆,但只是在图像上)。我创建了一个自定义的MyImageView类,它扩展了我在其上覆盖onDraw的ImageView。我希望ImageView位于屏幕的中心。
当我使用一个布局时,图像出现在TOP LEFT CORNER中,我可以毫无问题地在它上面绘图。
当我使用不同的布局时,图像显示在屏幕的中央但是画布仍然保留在左上角的这个小小矩形。因此,当我尝试在图像上绘图时,我只能在左上角进行绘制,并且更改会显示在中心的图像上。
在我的MainActivity中,我设置了:
myImageView = (MyImageView) findViewById(R.id.pdfView);
// I also extract the bitmap myBitmap from the pdf ...
// and pass it to the ImageView
myImageView.setImageBitmap(myBitmap);
// and I set the Canvas too:
Canvas myCanvas = new Canvas(myBitmap);
myImageView.setMyCanvas(myCanvas);
然后,这是MyImageView的关键部分:
public class MyImageView extends
android.support.v7.widget.AppCompatImageView {
// variables...
public MyImageView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
setupDrawing();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawPath(drawPath, drawPaint);
}
private void setupDrawing() { //...usual stuff here }
@Override
public boolean onTouchEvent(MotionEvent event) { //...usual stuff here }
public void setMyCanvas(Canvas canvas) { this.myCanvas = canvas; }
我是否必须在MyImageView或MainActivity中添加/更改某些内容,以便画布仅位于ImageView之上或至少在整个屏幕上拉伸?
答案 0 :(得分:1)
Canvas原点与ImageView scaleType或gravity之间没有关系。
Canvas的X,Y原点始终位于View的左上角,如果您想在View的其他部分绘制,则需要自己翻译坐标。
<强> ADDED 强> 首先要理解的是,画布不仅可以在您选择的图像上绘制所有视图。
要使路径绘图居中,那么您需要在onDraw中执行类似的操作
canvas.save();
canvas.translate( (getWidth() - pathWidth) / 2, (getHeight() - pathHeight) / 2);
canvas.drawPath(drawPath, drawPaint);
canvas.restore();
编程问题不仅仅是算术问题。
答案 1 :(得分:0)
for,ImageView是在屏幕的中心。修改您的布局如下
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:background="#EEEEEE">
<com.example.android.samplepaint.MyImageView
android:id="@+id/pdfView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:scaleType="fitXY"
android:layout_gravity="center_horizontal"
android:background="@android:color/white" />
</LinearLayout>
答案 2 :(得分:0)
我认为原因在于您的布局选择。由于屏幕自适应问题,每个布局都需要绑定到元素,有些布局默认为左上角。