0

您好,我想制作一个使用多点触控支持的应用程序。

对于多点触控,我正在使用此代码

现在您可以看到org.metalev.multitouch.photosortr.PhotoSortrActivity Activity 代码如下所示

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setTitle(R.string.instructions);
    photoSorter = new PhotoSortrView(this);
    setContentView(photoSorter);
}

它会正常工作

但是如果我想在我的视图中添加这个视图而不是这个,我会写上面的代码,如下所示......

我制作了一个名为 activity_main.xml 的 XML 文件

<org.metalev.multitouch.photosortr.PhotoSortrView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

</org.metalev.multitouch.photosortr.PhotoSortrView>

在 onCreate 方法中,我进行了如下更改

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setTitle(R.string.instructions);
    photoSorter = new PhotoSortrView(this);
    setContentView(R.layout.activity_main);
}

如果我喜欢这种方式,我会在下面得到一个错误是 logcat

10-30 12:15:29.319: E/AndroidRuntime(6652): java.lang.NullPointerException
10-30 12:15:29.319: E/AndroidRuntime(6652):     at org.metalev.multitouch.photosortr.PhotoSortrView$Img.draw(PhotoSortrView.java:274)
10-30 12:15:29.319: E/AndroidRuntime(6652):     at org.metalev.multitouch.photosortr.PhotoSortrView.onDraw(PhotoSortrView.java:86)
10-30 12:15:29.319: E/AndroidRuntime(6652):     at android.view.View.draw(View.java:6914)
10-30 12:15:29.319: E/AndroidRuntime(6652):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
10-30 12:15:29.319: E/AndroidRuntime(6652):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
10-30 12:15:29.319: E/AndroidRuntime(6652):     at android.view.View.draw(View.java:6917)
10-30 12:15:29.319: E/AndroidRuntime(6652):     at android.widget.FrameLayout.draw(FrameLayout.java:357)
10-30 12:15:29.319: E/AndroidRuntime(6652):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
10-30 12:15:29.319: E/AndroidRuntime(6652):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
10-30 12:15:29.319: E/AndroidRuntime(6652):     at android.view.ViewGroup.drawChild(ViewGroup.java:1644)

在 PhotoSortrView.java 文件中,代码如下所示,我收到此错误

public void draw(Canvas canvas) {
    canvas.save();
    float dx = (maxX + minX) / 2;
    float dy = (maxY + minY) / 2;
    ---->drawable.setBounds((int) minX, (int) minY, (int) maxX, (int) maxY); // HERE getting drawable == NULL
    canvas.translate(dx, dy);
    canvas.rotate(angle * 180.0f / (float) Math.PI);
    canvas.translate(-dx, -dy);
    drawable.draw(canvas);
    canvas.restore();
}
4

2 回答 2

1

唯一的原因可能是类中drawable使用draw()Img为空,因为canvas是由系统传递的,而方法中的其余变量是原语。该变量在 class 中初始化,load()Imgclass 又从 class 中loadImages()调用PhotoSortrView

现在,我猜你是loadImages()photoSorterActivity 调用变量onResume()。但是还有另一个PhotoSortrView实例是通过膨胀布局创建的。确保您也调用loadImages()该实例。

于 2012-10-30T07:50:57.327 回答
0

给僚机的建议我已经解决了如下方式:

  @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setTitle(R.string.instructions);
    setContentView(R.layout.activity_main);
    photoSorter = (PhotoSortrView)findViewById(R.id.photoSortView);
}

@Override
protected void onResume() {
    super.onResume();
    photoSorter.loadImages(this);
}

在 PhotosorterView.java 文件中的代码如下。

    public PhotoSortrView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context);
}

public PhotoSortrView(Context context) {
    super(context);
    init(context);
}

public PhotoSortrView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(context);
}
于 2012-10-30T10:17:51.493 回答