通过整个屏幕移动文本视图

Posted

技术标签:

【中文标题】通过整个屏幕移动文本视图【英文标题】:Moving textview through whole screen 【发布时间】:2012-05-28 08:08:11 【问题描述】:

我开发了一个全屏显示时间的应用程序。小时、分钟和秒显示在屏幕中间。所以我的目标是,当我长按任何文本视图时,能够在整个屏幕上滚动它,并将其放置在我想要的位置......

我试图找到一个合适的代码来应用到我的应用程序,我找到了一个代码,它可以将文本制作成图像,然后移动该图像。但问题是,文本每秒都在更新,所以我认为每秒创建图像不是一个好主意......

任何人都知道一种能够在整个屏幕上移动文本视图的方法??? 这是我的文本视图之一

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_
    android:layout_   >

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

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

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

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

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


  </FrameLayout>

【问题讨论】:

检查这个类似的问题Drag & Drop TextView 这样更适合控制,***.com/a/31094315/10751265 【参考方案1】:

将此添加到您的 onCreate:更好地使用 FrameLayout 本身。

 txtHour.setOnTouchListener(new OnTouchListener() 

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

这是你的活动类outoutside任何方法。

       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;
               
            

【讨论】:

我从所有视图中删除了 android:gravity 和 android android:layout_gravity 行....没有用,所有数字都放在同一个站点中,无法读取...有什么想法吗? ??谢谢!! 我进行了更多调查,并将 Log.i 函数放入每个案例中...问题是 drag 被正确调用,然后 action_down 案例显示日志但 acion_move 和 action_ up 不做任何日志....请帮忙!!! 这很奇怪! :P 你也在使用 onlongclick 监听器吗? 不,现在我正在使用 ontouchlistener,就像在 edit2 中一样...我正在搜索为什么不调用 actionup 和 actionmove...我发现了一些关于使用 invalidate 或 return true .... 做什么你觉得??? 嗯....是的!!!!!!!!!!!!成功了,谢谢!!!!刚刚在 ontouch() 内部返回 true 而不是 false ...【参考方案2】:
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;
    
    

将此方法复制到您的类并在您的 textview 的 ontouch() 中调用它。在这里我假设你使用 Framelayout。如果不相应更改布局参数。

【讨论】:

谢谢!但它显示错误:新 View.OnLongClickListener() 类型的方法 drag(MotionEvent, View) 从未在本地使用,有什么帮助吗? 请看第一条消息中的编辑,我使用的是相对布局...所以,这样好吗? 如果您使用相对布局,您必须将所有内容与边界相关联,而不是与任何视图相关联。然后应用边距。最好使用框架布局,或者不推荐使用绝对布局。顺便说一下,在视图的 onTouch 中调用它。是的,你在这里需要 onTouch。 嗨,我又来了……这个方法与 ICS 兼容吗?我问这个是因为我最近将手机更新到 ICS,现在我只能垂直移动 textviews.. 这很奇怪!我不确定 abt ICS,相同的 apk 在较低的应用程序中工作正常吗?

以上是关于通过整个屏幕移动文本视图的主要内容,如果未能解决你的问题,请参考以下文章

带有桌面站点视图的移动设备上元素的绝对高度和宽度为100%

如何在整个屏幕上滚动表格视图

文本不使用文本视图的整个宽度

Android如何在文本视图或任何东西中打印数组

整个图像在屏幕上的移动

是否可以使滚动视图不覆盖整个屏幕?