Android: проблема перетаскивания - PullRequest
7 голосов
/ 23 февраля 2011

Я пишу композитор SMIL для класса, и я планировал сделать поддержку холстом перетаскиванием, чтобы вы могли размещать изображения и текст так, как вам удобно.Я просмотрел примеры и сделал несколько самостоятельно, но когда я иду к реализации перетаскивания в моем проекте, это не работает.Вот основной код, который имеет значение:

public class ComposerActivity extends Activity {
    /** Called when the activity is first created. */

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.composer);

    Button add = (Button)findViewById(R.id.addBtn);
    ...

    add.setOnClickListener(mClick);
    ...
}

OnClickListener mClick = new OnClickListener() {
    @Override
    public void onClick(View v){        
        if(v.getId() == R.id.addBtn)
        {
            FrameLayout fl = (FrameLayout)findViewById(R.id.Canvas); 
            LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
            View itemView = inflater.inflate(R.layout.image_add, null);

            View image = (View)itemView.findViewById(R.id.image);   
            image.setBackgroundResource(R.drawable.icon); 

            fl.addView(itemView, new FrameLayout.LayoutParams(40, 40));  

            image.setOnTouchListener(drag);
        }
        ...

OnTouchListener drag = 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.image:{//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 image
        }//switch 
            return true; 
        }//onTouch 
    };//drag
}

Вот composer.xml:

...
<FrameLayout android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_below="@+id/TopBar" 
    android:layout_above="@+id/addBtn" 
    android:id="@+id/Canvas"
    android:layout_gravity="top">

</FrameLayout>
...

и image_add.xml:

<View android:id="@+id/image" 
        android:layout_gravity="top"
        xmlns:android="http://schemas.android.com/apk/res/android"/> 

Когда янажмите кнопку «Добавить» на моем композиторе, он успешно добавляет изображение на холст, а когда я касаюсь изображения, оно увеличивается, увеличиваясь с 40х40 до 60х60, как и должно быть.Но это не следит за моим пальцем по экрану, и вот где я застрял.

Любой вклад приветствуется.

Ответы [ 2 ]

14 голосов
/ 24 февраля 2011

Я изучил код Android Launcher, чтобы увидеть, как они перетаскивали.Мне очень нравится их объектная модель.То, что они сделали, и это может быть полезно для вас, это переместить ответственность за обработку перетаскивания в ViewGroup, в которой находятся все перетаскиваемые виды.События касания обрабатываются там, а не в ваших видах.

Два ключевых класса:

DragLayer - реализует пользовательскую ViewGroup, которая координирует перемещение видов на экране.Launcher DragLayer является подклассом FrameLayout.

DragController - этот объект является контроллером, который выполняет большую часть работы по поддержке перетаскивания.

Другая вещь, которую они делают, не перемещает фактический вид, пока вы не уроните перетаскиваемый объект.,Хотя это не выглядит так, потому что на экране вы видите растровое изображение, построенное из вида, движущегося при движении пальца (или указателя).

Я построил простой пример и написал его.См. http://blahti.wordpress.com/2011/01/17/moving-views-part-2/ Исходный код примера тоже есть.

1 голос
/ 14 ноября 2011

Если вы ищете готовое решение, вот что:

https://github.com/thquinn/DraggableGridView

Это пользовательская группа ViewGroup, которую я собрал и которая кажется подходящей для вашего проекта.,Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...