【发布时间】:2015-01-12 07:47:25
【问题描述】:
在我的应用程序中,我使用 MainActivity 类中的 Canvas 对象绘制某些图形。之后,当用户在屏幕上滑动时,我使用自定义视图在之前创建的图形上绘制水平线和垂直线。
问题是MainActivity和CustomView之间有轻微的坐标偏移。因此,我的线条与游戏中的其他图形对象不符。为了确认这一点,我从 MainActivity 和我的 CustomView 类中进行了以下调用:
canvas.drawLine(0, 0, 50, 50, 油漆);
结果是两条平行线。 CustomView 的原点位于手机的右上角,MainActivity 类的原点有一定的偏移量。
(截图:http://i.stack.imgur.com/x3BDK.png)
如果有人能指出这里可能出现的问题,我将不胜感激。
以下是相关文件:
activity_main.xml
<com.example.offsettest.CustomLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/customLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:paddingBottom="0dp"
android:paddingTop="0dp"
android:layout_marginLeft="0dp"
android:layout_marginRight="0dp"
android:layout_marginTop="0dp"
android:layout_marginBottom="0dp">
</com.example.offsettest.CustomLayout>
MainActivity.java
package com.example.offsettest;
import com.rgtech.offsettest.R;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Menu;
import android.widget.ImageView;
public class MainActivity extends Activity {
private Bitmap bitmap;
private Canvas mCanvas;
private Paint paint;
private CustomLayout customLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
draw();
}
public void draw(){
DisplayMetrics metrics = this.getResources().getDisplayMetrics();
float width = metrics.widthPixels;
float height = metrics.heightPixels;
bitmap = Bitmap.createBitmap((int) width, (int) height, Config.RGB_565);
mCanvas = new Canvas(bitmap);
mCanvas.drawColor(Color.GREEN);
paint = new Paint();
paint.setAntiAlias(true);
customLayout = (CustomLayout) findViewById(R.id.customLayout);
ImageView imageView = new ImageView(this);
imageView.setImageBitmap(bitmap);
imageView.setPadding(0, 0, 0, 0);
customLayout.addView(imageView);
paint.setColor(Color.BLACK);
mCanvas.drawLine(0, 0, 50, 50, paint);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
CustomLayout.java
package com.example.offsettest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.LinearLayout;
@SuppressLint("NewApi")
public class CustomLayout extends LinearLayout{
private Paint paint = new Paint();
public CustomLayout(Context context) {
super(context);
}
public CustomLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomLayout(Context context, AttributeSet attrs,int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
paint.setColor(Color.BLACK);
paint.setAntiAlias(true);
paint.setDither(true);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeWidth(5);
paint.setColor(Color.RED);
canvas.drawLine(0, 0, 50, 50, paint);
}
}
除了这些文件,我只在Manifest文件中设置了android:theme="@android:style/Theme.NoTitleBar"。
【问题讨论】:
-
如果您发布有问题的代码 sn-ps 会更容易可视化,包括 MainActivity 的布局 xml。
-
@JustinPowell 感谢您的意见。我已经添加了相关代码sn-p。我的 mxml 只包含自定义视图。如果您能就可能出现的问题提供一些指示,那就太好了。
标签: java android graphics coordinates