Перемещение textview через весь экран

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

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

Кто-нибудь знает способ перемещать текстовые изображения по всему экрану ??? Это один из моих текстов

private TextView txtHour;

txtHour = (TextView)findViewById(R.id.TxtHour);

txtHour.setOnLongClickListener(new OnLongClickListener{
....

Я не знаю, что добавить к этому.... :( Пожалуйста, ПОМОГИТЕ!

РЕДАКТИРОВАТЬ: Согласно первому ответу, должен ли мой код выглядеть так?

         txtHour.setOnLongClickListener(new OnLongClickListener() {
             public void onLongClick(View v){


               public void drag(MotionEvent event, View v)
                {

                    RelativeLayout.LayoutParams params = (android.widget.RelativeLayout.LayoutParams) v.getLayoutParams();

                    switch(event.getAction())
                    {
                       case MotionEvent.ACTION_MOVE:
                       {
                         params.topMargin = (int)event.getRawY() - (v.getHeight());
                         params.leftMargin = (int)event.getRawX() - (v.getWidth()/2);
                         v.setLayoutParams(params);
                         break;
                       }
                       case MotionEvent.ACTION_UP:
                       {
                         params.topMargin = (int)event.getRawY() - (v.getHeight());
                         params.leftMargin = (int)event.getRawX() - (v.getWidth()/2);
                         v.setLayoutParams(params);
                         break;
                       }
                       case MotionEvent.ACTION_DOWN:
                       {
                        v.setLayoutParams(params);
                        break;
                       }
                    }

           }});

РЕДАКТИРОВАТЬ 2: наконец, это код результата, это нормально?

 package com.iamaner.T2Speech;
 //imports
 public class MAINActivity extends Activity{

 private TextView txtHour;
 private TextView txtMinutes;
 private TextView txtSeconds;

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

txtHour = (TextView)findViewById(R.id.TxtHour);
txtMinutes = (TextView)findViewById(R.id.TxtMinute);
txtSeconds = (TextView)findViewById(R.id.TxtSeconds);

txtHour.setOnTouchListener(new OnTouchListener() {

    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
        drag(event, v);
        return false;
    }});
 }
 public void drag(MotionEvent event, View v)
{

    FrameLayout.LayoutParams params = (android.widget.FrameLayout.LayoutParams) v.getLayoutParams();

    switch(event.getAction())
    {
       case MotionEvent.ACTION_MOVE:
       {params.topMargin = (int)event.getRawY() - (v.getHeight());
        params.leftMargin = (int)event.getRawX() - (v.getWidth()/2);
        v.setLayoutParams(params);
        break;}
       case MotionEvent.ACTION_UP:
       {params.topMargin = (int)event.getRawY() - (v.getHeight());
        params.leftMargin = (int)event.getRawX() - (v.getWidth()/2);
        v.setLayoutParams(params);
        break;}
       case MotionEvent.ACTION_DOWN:
       {v.setLayoutParams(params);
        break;}
       }}
       }

И этот макет кадра

      <?xml version="1.0" encoding="utf-8"?>
  <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/your_layout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"   >

<TextView
    android:id="@+id/TxtHour"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="15mm"
    android:textColor="#000000"/>

<TextView
    android:id="@+id/TxtPoints1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/separator"
    android:textSize="15mm"
    android:textColor="#000000"
    android:layout_gravity="center"
    android:gravity="center"/>

<TextView
    android:id="@+id/TxtMinute"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="15mm" 
    android:textColor="#000000"
    android:layout_gravity="center"
    android:gravity="center" />

 <TextView
    android:id="@+id/TxtPoints2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/separator"
    android:textSize="15mm"
    android:textColor="#000000"
    android:layout_gravity="center"
    android:gravity="center"/>

 <TextView
    android:id="@+id/TxtSeconds"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="15mm"
    android:textColor="#000000"
    android:layout_gravity="bottom|right" />


  </FrameLayout>

person BamsBamx    schedule 21.05.2012    source источник
comment
Проверьте этот аналогичный вопрос Drag & Drop TextView   -  person Imran Rana    schedule 22.05.2012


Ответы (2)


Добавьте это в свой onCreate: лучше используйте сам FrameLayout.

 txtHour.setOnTouchListener(new OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            drag(event, v);
            return false;
        }
    });

И это для вашего класса активности вне любых методов.

       public void drag(MotionEvent event, View v)
        {

            RelativeLayout.LayoutParams params = (android.widget.RelativeLayout.LayoutParams) v.getLayoutParams();

            switch(event.getAction())
            {
               case MotionEvent.ACTION_MOVE:
               {
                 params.topMargin = (int)event.getRawY() - (v.getHeight());
                 params.leftMargin = (int)event.getRawX() - (v.getWidth()/2);
                 v.setLayoutParams(params);
                 break;
               }
               case MotionEvent.ACTION_UP:
               {
                 params.topMargin = (int)event.getRawY() - (v.getHeight());
                 params.leftMargin = (int)event.getRawX() - (v.getWidth()/2);
                 v.setLayoutParams(params);
                 break;
               }
               case MotionEvent.ACTION_DOWN:
               {
                v.setLayoutParams(params);
                break;
               }
            }
person Vishnu Mohan G    schedule 22.05.2012
comment
Я удалил строки android:gravity и android android:layout_gravity из всех представлений .... не сработало, все числа размещены на одном сайте и не могут быть прочитаны ... Любая идея, пожалуйста ??? Спасибо!! - person BamsBamx; 22.05.2012
comment
Я исследовал больше, и я поставил функцию Log.i в каждый случай ... Дело в том, что drag вызывается правильно, а затем action_down случай показывает журнал, но acion_move и action_ up не делают никакого журнала .... Пожалуйста, помогите !!! - person BamsBamx; 24.05.2012
comment
это странно! : P Вы также используете прослушиватель onlongclick? - person Vishnu Mohan G; 24.05.2012
comment
Нет, сейчас я использую ontouchlistener, как и в edit2... Я ищу, почему не вызываются actionup и actionmove... Я нашел кое-что об использовании недействительности или возврата true.... Что вы думаете??? - person BamsBamx; 24.05.2012
comment
ну не обязательно, можно попробовать. - person Vishnu Mohan G; 24.05.2012
comment
Ну да!!!!!!!!!!!!! ПОЛУЧИЛОСЬ, СПАСИБО!!!! Только что вернул true вместо false внутри ontouch()... - person BamsBamx; 24.05.2012
comment
ну, верните true и layout_gravity = top. - person Vishnu Mohan G; 24.05.2012

public void drag(MotionEvent event, View v)
{

    FrameLayout.LayoutParams params = (android.widget.FrameLayout.LayoutParams) v.getLayoutParams();

    switch(event.getAction())
    {
    case MotionEvent.ACTION_MOVE:
    {
        params.topMargin = (int)event.getRawY() - (v.getHeight());
        params.leftMargin = (int)event.getRawX() - (v.getWidth()/2);
        v.setLayoutParams(params);
        break;
    }
    case MotionEvent.ACTION_UP:
    {
        params.topMargin = (int)event.getRawY() - (v.getHeight());
         params.leftMargin = (int)event.getRawX() - (v.getWidth()/2);
        v.setLayoutParams(params);
        break;
    }
    case MotionEvent.ACTION_DOWN:
    {
        v.setLayoutParams(params);
        break;
    }
    }
}

Скопируйте этот метод в свой класс и вызовите его внутри ontouch() вашего текстового представления. Здесь я предполагаю, что вы используете Framelayout. Если нет, измените параметры макета соответствующим образом.

person Vishnu Mohan G    schedule 21.05.2012
comment
Благодарность! но он показывает ошибку: метод drag(MotionEvent, View) из типа new View.OnLongClickListener(){} никогда не используется локально, есть помощь? - person BamsBamx; 22.05.2012
comment
Пожалуйста, посмотрите редактирование в первом сообщении, я использую относительную компоновку... Итак, все в порядке? - person BamsBamx; 22.05.2012
comment
если вы используете относительный макет, вы должны связать все с границами, а не с каким-либо представлением. затем примените поля. Лучше использовать framelayout, ну или абсолютный макет устарел. И, кстати, вызывайте это в onTouch представлений. да, вам нужно onTouch здесь. - person Vishnu Mohan G; 22.05.2012
comment
Привет, я снова здесь... Этот метод совместим с ICS?? Я спрашиваю об этом, потому что недавно обновил свой телефон до ICS, и теперь я могу перемещать текст только по вертикали. - person BamsBamx; 14.06.2012
comment
Это странно! я не уверен в ICS, тот же apk нормально работает в более низких? - person Vishnu Mohan G; 22.06.2012