2015-07-20 25 views
1

在这里,我想拖放正确的图像,即左侧的字母A到右侧的图像,并将分数设置为1。但是,在编写下面的代码后,所有图像在视图外面都会消失。而且所有的图像都会使得分数与正确的分数一起上升。任何人都可以帮助我?如何使正确的图像放置在各自的图像视图?

我对Gameactivity代码:

img1 = (ImageView) findViewById(R.id.ic_one); 
    img2 = (ImageView) findViewById(R.id.ic_two); 
    img3 = (ImageView) findViewById(R.id.ic_three); 
    img4 = (ImageView) findViewById(R.id.ic_four); 
    imgmain = (ImageView) findViewById(R.id.ic_main); 

    img1.setImageResource(R.mipmap.a1); 
img2.setImageResource(R.mipmap.a2); 
img3.setImageResource(R.mipmap.a3); 
img4.setImageResource(R.mipmap.a4); 
imgmain.setImageResource(R.mipmap.a1); 

    //setting touch listener 

    img1.setOnTouchListener(listenTouch); 
    img2.setOnTouchListener(listenTouch); 
    img3.setOnTouchListener(listenTouch); 
    img4.setOnTouchListener(listenTouch); 
    imgmain.setOnDragListener(listenDrag); 

    display = (TextView) findViewById(R.id.txtScore); 

} 

public View.OnTouchListener listenTouch = new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      //setup drag 
      ClipData data = ClipData.newPlainText("", ""); 
      View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v); 
      v.startDrag(data, shadowBuilder, v, 0); 
      v.setVisibility(View.INVISIBLE); 

      return true; 
     } else { 
      return false; 
     } 
    } 
}; 
public View.OnDragListener listenDrag = new View.OnDragListener() { 
    @Override 
    public boolean onDrag(View v, DragEvent event) { 

     switch (event.getAction()) { 
      case DragEvent.ACTION_DRAG_STARTED: 


      case DragEvent.ACTION_DRAG_ENTERED: 
       //no action necessary 
       break; 
      case DragEvent.ACTION_DRAG_EXITED: 
       //no action necessary 

       break; 
      case DragEvent.ACTION_DROP: 
       //handle the dragged view being dropped over a drop view 
       if(v.getId() == R.id.ic_main) { 
        View view = (View) event.getLocalState(); 
        ViewGroup viewgroup = (ViewGroup) view.getParent(); 
       viewgroup.removeView(view); 

        //change the text 
        score++; 
        display.setText("Your score is : "+score); 


        view.setVisibility(View.VISIBLE); 
       } else { 
        View view = (View) event.getLocalState(); 
        view.setVisibility(View.VISIBLE); 
        Context context = getApplicationContext(); 
        Toast.makeText(context, "You can't drop the image here", 
          Toast.LENGTH_LONG).show(); 
        break; 
       } 
       break; 
      case DragEvent.ACTION_DRAG_ENDED: 
       //no action necessary 
       break; 
      default: 
       break; 
     } 

     return true; 
    } 
}; 

}

我的布局代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:paddingBottom="@dimen/activity_vertical_margin" 
tools:context="com.example.bhuwan.firstproject.GameActivity" 
android:id="@+id/layout_game"> 

<ImageView 
    android:layout_width="150dp" 
    android:layout_height="150dp" 
    android:id="@+id/ic_main" 
    android:layout_alignBottom="@+id/ic_two" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentEnd="true" 
    android:layout_marginBottom="36dp" /> 

<ImageView 
    android:layout_width="100dp" 
    android:layout_height="100dp" 
    android:id="@+id/ic_one" 
    android:layout_alignParentTop="true" /> 

<ImageView 
    android:layout_width="100dp" 
    android:layout_height="100dp" 
    android:id="@+id/ic_two" 
    android:layout_marginTop="143dp" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" /> 

<ImageView 
    android:layout_width="100dp" 
    android:layout_height="100dp" 
    android:id="@+id/ic_three" 
    android:layout_alignParentTop="true" 
    android:layout_toRightOf="@+id/ic_one" 
    android:layout_toEndOf="@+id/ic_one" /> 

<ImageView 
    android:layout_width="100dp" 
    android:layout_height="100dp" 
    android:id="@+id/ic_four" 
    android:layout_alignTop="@+id/ic_two" 
    android:layout_toRightOf="@+id/ic_two" 
    android:layout_toEndOf="@+id/ic_two" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:text="@string/empty" 
    android:id="@+id/txtScore" 
    android:layout_marginBottom="60dp" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_marginLeft="42dp" 
    android:layout_marginStart="42dp" /> 

+0

请更好地说明你拥有什么。你有五个图像我们可以看到。它们包含什么?字母A-E的图片?现在,如果你将A拖到D那么会发生什么?你没有告诉。为什么两个图像包含相同的图片? – greenapps

+0

我有五个图像视图之一是主视图上的图像形成其他四个图像视图应该放弃,在四个图像视图我有图像的信件从一个 - E和主视图我有四个图像之一,所以我需要拖放正确的一个,错误的仍然照常。 @greenapps –

+0

'所有图像在视图外面时都会消失。 ”。那是因为你马上让它们在onToch中不可见。不要这样做。 – greenapps

回答

0

你的逻辑有一些问题。我做了一些改变。请尝试并告诉我是否更好:

img1 = (ImageView) findViewById(R.id.ic_one); 
    img2 = (ImageView) findViewById(R.id.ic_two); 
    img3 = (ImageView) findViewById(R.id.ic_three); 
    img4 = (ImageView) findViewById(R.id.ic_four); 
    imgmain = (ImageView) findViewById(R.id.ic_main); 

    img1.setImageResource(R.mipmap.a1); 
    img2.setImageResource(R.mipmap.a2); 
    img3.setImageResource(R.mipmap.a3); 
    img4.setImageResource(R.mipmap.a4); 
    imgmain.setImageResource(R.mipmap.a1); 

    //setting touch listener 

    img1.setOnTouchListener(listenTouch); 
    img2.setOnTouchListener(listenTouch); 
    img3.setOnTouchListener(listenTouch); 
    img4.setOnTouchListener(listenTouch); 
    imgmain.setOnDragListener(listenDrag); 

    display = (TextView) findViewById(R.id.txtScore); 

} 

public View.OnTouchListener listenTouch = new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      //setup drag 
      ClipData data = ClipData.newPlainText("", ""); 
      View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v); 
      v.startDrag(data, shadowBuilder, v, 0); 
      v.setVisibility(View.INVISIBLE); 
      img1.setOnTouchListener(null); 
      img2.setOnTouchListener(null); 
      img3.setOnTouchListener(null); 
      img4.setOnTouchListener(null); 
     } 
     return false; 
    } 
}; 
public View.OnDragListener listenDrag = new View.OnDragListener() { 
    @Override 
    public boolean onDrag(View v, DragEvent event) { 

     switch (event.getAction()) { 
      case DragEvent.ACTION_DRAG_STARTED: 
      case DragEvent.ACTION_DRAG_ENTERED: 
      case DragEvent.ACTION_DRAG_EXITED: 
       break; 
      case DragEvent.ACTION_DRAG_ENDED: 
       img1.setOnTouchListener(listenDrag); 
       img2.setOnTouchListener(listenDrag); 
       img3.setOnTouchListener(listenDrag); 
       img4.setOnTouchListener(listenDrag); 
       View view = (View) event.getLocalState(); 
       view.setVisibility(View.VISIBLE); 
       if (!getResoult()) { 
        Context context = getApplicationContext(); 
        Toast.makeText(context, "You can't drop the image here", Toast.LENGTH_LONG).show(); 
       } 
       break; 
      case DragEvent.ACTION_DROP: 
       //handle the dragged view being dropped over a drop view 
        View viewCorrect = (View) event.getLocalState(); 
        ViewGroup viewgroup = (ViewGroup) viewCorrect.getParent(); 
        viewgroup.removeView(viewCorrect); 
        //change the text 
        score++; 
        display.setText("Your score is : "+score); 
       break; 
     } 

     return true; 
    } 
}; 
+0

我很抱歉,但我无法真正弄清楚“if(!getResoult())”是真的吗? @yshahak –

+0

当查看注册到DragEvent的事件时获取事件DragEvent.ACTION_DROP他决定要做什么并返回布尔值。这将在DragEvent.ACTION_DRAG_ENDED内向所有注册到DragEvents的视图发送,并通过调用getResults()来访问它。在你的情况下,当ACTION_DROP永远不会调用(这一点在你的注册视图之外),这意味着getResults()返回false – yshahak

+0

你当然应该发布'getResoult()'的代码,而不是谈论它。此外,你可以解释为什么你删除触摸监听器。没有意义。 – greenapps

相关问题