在 android 浮动视图中动态更改文本
dynamically changing text in android floating view
我只是 android 的初学者,我被指派为我们的 android 团队项目创建一个浮动视图,到目前为止我已经能够创建该服务,现在我正在尝试以某种方式将浮动视图中的图像更改为动态变化的文本,但我不知道该怎么做,所以如果有人能帮助我,我将不胜感激。
FloatService.Java
package com.example.justeen.floatexample;
import android.app.Service;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
public class FloatService extends Service{
private WindowManager windowManager;
private ImageView floatIcon;
@Override public IBinder onBind(Intent intent) {
// Not used
return null;
}
@Override public void onCreate() {
super.onCreate();
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
floatIcon = new ImageView(this);
floatIcon.setImageResource(R.drawable.android_head);
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.LEFT;
params.x = 0;
params.y = 100;
windowManager.addView(floatIcon, params);
try {
floatIcon.setOnTouchListener(new View.OnTouchListener() {
private int initialX;
private int initialY;
private float initialTouchX;
private float initialTouchY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
initialX = params.x;
initialY = params.y;
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
return true;
case MotionEvent.ACTION_UP:
return true;
case MotionEvent.ACTION_MOVE:
params.x = initialX + (int) (event.getRawX() - initialTouchX);
params.y = initialY + (int) (event.getRawY() - initialTouchY);
windowManager.updateViewLayout(floatIcon, params);
return true;
}
return false;
}
});
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (floatIcon != null) windowManager.removeView(floatIcon);
}
}
这是更新码
package com.example.justeen.floatexample;
import android.app.Service;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.os.IBinder;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;
public class FloatService extends Service{
private WindowManager windowManager;
private TextView textView;
private Bundle extras;
@Override public IBinder onBind(Intent intent) {
// Not used
return null;
}
@Override public void onCreate() {
super.onCreate();
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
textView = new TextView(this);
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.LEFT;
params.x = 0;
params.y = 100;
windowManager.addView(textView, params);
try {
textView.setOnTouchListener(new View.OnTouchListener() {
private int initialX;
private int initialY;
private float initialTouchX;
private float initialTouchY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
initialX = params.x;
initialY = params.y;
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
return true;
case MotionEvent.ACTION_UP:
return true;
case MotionEvent.ACTION_MOVE:
params.x = initialX + (int) (event.getRawX() - initialTouchX);
params.y = initialY + (int) (event.getRawY() - initialTouchY);
windowManager.updateViewLayout(textView, params);
return true;
}
return false;
}
});
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public int onStartCommand( Intent intent , int flags , int startId ) {
super.onStartCommand(intent, flags, startId);
extras = intent.getExtras();
return START_REDELIVER_INTENT;
}
@Override
public void onDestroy() {
super.onDestroy();
if (textView != null) windowManager.removeView(textView);
}
}
1. 在您的服务中使用 TextView
而不是 ImageView
。
2. 我猜你正在使用 startservice(Intent)
调用你的服务,因为你没有使用 onBind()
。现在,每次您需要更新 "floating text" 时,调用 activity 中的 startservice
方法,但在 Intent
中添加一个包含要更新的文本的额外字符串。示例(在您的 Activity 内):
Intent i = new Intent(context,YourService.class);
i.putExtra("TEXT","Updated the text in my service");
startService(i);
3. 在您的服务中实施 onStartCommand()
。每次使用上一步中提到的 startservice
时都会调用此方法。 onCreate
只被调用一次。
4. 在方法 onStartCommand
中检索意图并使用额外的字符串更新服务中的 TextView。示例(在 onStartCommand()
内):
String textToUpdate = intent.getStringExtra("TEXT");
yourTextView.setText(textToUpdate);
请记住,从 Service
扩展并使用 startService
使您有责任在不再需要服务时使用 stopservice
或 stopSelf
停止服务。
我只是 android 的初学者,我被指派为我们的 android 团队项目创建一个浮动视图,到目前为止我已经能够创建该服务,现在我正在尝试以某种方式将浮动视图中的图像更改为动态变化的文本,但我不知道该怎么做,所以如果有人能帮助我,我将不胜感激。
FloatService.Java
package com.example.justeen.floatexample;
import android.app.Service;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
public class FloatService extends Service{
private WindowManager windowManager;
private ImageView floatIcon;
@Override public IBinder onBind(Intent intent) {
// Not used
return null;
}
@Override public void onCreate() {
super.onCreate();
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
floatIcon = new ImageView(this);
floatIcon.setImageResource(R.drawable.android_head);
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.LEFT;
params.x = 0;
params.y = 100;
windowManager.addView(floatIcon, params);
try {
floatIcon.setOnTouchListener(new View.OnTouchListener() {
private int initialX;
private int initialY;
private float initialTouchX;
private float initialTouchY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
initialX = params.x;
initialY = params.y;
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
return true;
case MotionEvent.ACTION_UP:
return true;
case MotionEvent.ACTION_MOVE:
params.x = initialX + (int) (event.getRawX() - initialTouchX);
params.y = initialY + (int) (event.getRawY() - initialTouchY);
windowManager.updateViewLayout(floatIcon, params);
return true;
}
return false;
}
});
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (floatIcon != null) windowManager.removeView(floatIcon);
}
}
这是更新码
package com.example.justeen.floatexample;
import android.app.Service;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.os.IBinder;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;
public class FloatService extends Service{
private WindowManager windowManager;
private TextView textView;
private Bundle extras;
@Override public IBinder onBind(Intent intent) {
// Not used
return null;
}
@Override public void onCreate() {
super.onCreate();
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
textView = new TextView(this);
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.LEFT;
params.x = 0;
params.y = 100;
windowManager.addView(textView, params);
try {
textView.setOnTouchListener(new View.OnTouchListener() {
private int initialX;
private int initialY;
private float initialTouchX;
private float initialTouchY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
initialX = params.x;
initialY = params.y;
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
return true;
case MotionEvent.ACTION_UP:
return true;
case MotionEvent.ACTION_MOVE:
params.x = initialX + (int) (event.getRawX() - initialTouchX);
params.y = initialY + (int) (event.getRawY() - initialTouchY);
windowManager.updateViewLayout(textView, params);
return true;
}
return false;
}
});
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public int onStartCommand( Intent intent , int flags , int startId ) {
super.onStartCommand(intent, flags, startId);
extras = intent.getExtras();
return START_REDELIVER_INTENT;
}
@Override
public void onDestroy() {
super.onDestroy();
if (textView != null) windowManager.removeView(textView);
}
}
1. 在您的服务中使用 TextView
而不是 ImageView
。
2. 我猜你正在使用 startservice(Intent)
调用你的服务,因为你没有使用 onBind()
。现在,每次您需要更新 "floating text" 时,调用 activity 中的 startservice
方法,但在 Intent
中添加一个包含要更新的文本的额外字符串。示例(在您的 Activity 内):
Intent i = new Intent(context,YourService.class);
i.putExtra("TEXT","Updated the text in my service");
startService(i);
3. 在您的服务中实施 onStartCommand()
。每次使用上一步中提到的 startservice
时都会调用此方法。 onCreate
只被调用一次。
4. 在方法 onStartCommand
中检索意图并使用额外的字符串更新服务中的 TextView。示例(在 onStartCommand()
内):
String textToUpdate = intent.getStringExtra("TEXT");
yourTextView.setText(textToUpdate);
请记住,从 Service
扩展并使用 startService
使您有责任在不再需要服务时使用 stopservice
或 stopSelf
停止服务。