通过整个屏幕移动文本视图
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 在较低的应用程序中工作正常吗?以上是关于通过整个屏幕移动文本视图的主要内容,如果未能解决你的问题,请参考以下文章