מכיוון שלא עשיתי זאת בעבר חיפשתי ברשת מישהו שעשה זאת בעבר ו....חושך.
היו המון מימושים ליצירת ממשק שכזה ב-surfaceView כאשר האובייקטים בממשק הינן צלמיות מסוג bitmap ותו לא (מימוש שלדעתי הצנועה הוא לא מימוש ממש טוב בלשון המעטה).
יתרה מכך - בסוף כל עמוד מימוש שכזה היו מספר תגובות של אנשים שמחפשים את דרך המימוש המלאה (בדיוק את מה שאני חיפשתי) של ממשק בו האובייקטים הינם Views מלאים מן המניין, לכן החלטתי שלא רק שאממש בדרכי שלי ולא אנסה לאנוס את המימוש הנפוץ אלא אפרסם את הפתרון שלי כדי שעוד מפתחים אחרי לא ירגישו את התסכול הנדיר של חיפוש מימוש מסויים ולא למצאו (דיי הפעם הראשונה שזה קרה לי).
ולכן:
- קוד: בחר הכל
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.FrameLayout;
import android.widget.Toast;
import android.widget.FrameLayout.LayoutParams;
public class dnd extends Activity
{
public FrameLayout board;
public View pawn;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
board = new FrameLayout(this);
pawn = new View(this);
setContentView(R.layout.main);
board = (FrameLayout)findViewById(R.id.Board);
pawn = findViewById(R.id.Pawn);
pawn.setOnTouchListener(dragt);
}//onCreate
OnTouchListener dragt = new OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
FrameLayout.LayoutParams par = (LayoutParams) v.getLayoutParams();
switch(v.getId())
{//What is being touched
case R.id.Pawn:
{//Which action is being taken
switch(event.getAction())
{
case MotionEvent.ACTION_MOVE:
{
par.topMargin = (int)event.getRawY() - (v.getHeight());
par.leftMargin = (int)event.getRawX() - (v.getWidth()/2);
v.setLayoutParams(par);
break;
}//inner case MOVE
case MotionEvent.ACTION_UP:
{
par.height = 40;
par.width = 40;
par.topMargin = (int)event.getRawY() - (v.getHeight());
par.leftMargin = (int)event.getRawX() - (v.getWidth()/2);
v.setLayoutParams(par);
break;
}//inner case UP
case MotionEvent.ACTION_DOWN:
{
par.height = 60;
par.width = 60;
v.setLayoutParams(par);
break;
}//inner case UP
}//inner switch
break;
}//case pawn
}//switch
return true;
}//onTouch
};//dragt
- קוד: בחר הכל
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/Board" android:layout_gravity="top">
<View android:background="@drawable/icon"
android:layout_height="40dp"
android:layout_width="40dp"
android:id="@+id/Pawn" android:layout_gravity="top">
</View>
</FrameLayout>
חוץ מכאן פרסמתי במקביל פוסט דומה באנגלית:
http://www.anddev.org/viewtopic.php?p=41611#41611
מקווה שעזרתי למישהו אי-שם,בהצלחה.
.search tags: Views,Android,android, UI, GUI, drag, and, drop, developing
