Java 将活动中的图像传递给android类(实时壁纸)
我正在研究如何应用实时壁纸(GIF图像)。当我点击应用按钮时,默认的gif图像设置为壁纸。我正在从firebase获取所有图像。因此,我想将该图像设置为壁纸。我不知道如何将该gif图像从Java 将活动中的图像传递给android类(实时壁纸),java,android,live-wallpaper,Java,Android,Live Wallpaper,我正在研究如何应用实时壁纸(GIF图像)。当我点击应用按钮时,默认的gif图像设置为壁纸。我正在从firebase获取所有图像。因此,我想将该图像设置为壁纸。我不知道如何将该gif图像从LiveViewActivity传递到gifwallperservice以将该.gif图像设置为实时壁纸,而不是默认图像。(对不起,我的英语不好,希望你能理解) LiveViewActivity 我在其中添加了一个按钮以应用实时墙纸 public class GIFWallpaperService extend
LiveViewActivity
传递到gifwallperservice
以将该.gif图像设置为实时壁纸,而不是默认图像。(对不起,我的英语不好,希望你能理解)
LiveViewActivity
我在其中添加了一个按钮以应用实时墙纸
public class GIFWallpaperService extends WallpaperService {
@Override
public WallpaperService.Engine onCreateEngine() {
try {
Movie movie = Movie.decodeStream(getResources().getAssets().open("sea_gif.gif")); //Here is the default gif image
return new GIFWallpaperEngine(movie);
} catch (IOException e) {
Log.d("GIFWallpaperService", "Could not loaded live wallpaper");
return null;
}
}
private class GIFWallpaperEngine extends WallpaperService.Engine {
private final int frameDuration = 20;
private SurfaceHolder holder;
private Movie movie;
private boolean visible;
private Handler handler;
public GIFWallpaperEngine(Movie movie) {
this.movie = movie;
handler = new Handler();
}
@Override
public void onCreate(SurfaceHolder surfaceHolder) {
super.onCreate(surfaceHolder);
this.holder = surfaceHolder;
}
private Runnable drawGIF = new Runnable() {
@Override
public void run() {
draw();
}
};
private void draw() {
if (visible) {
Canvas canvas = holder.lockCanvas();
canvas.save();
canvas.scale(4f, 4f);
movie.draw(canvas, -100, 0);
canvas.restore();
holder.unlockCanvasAndPost(canvas);
movie.setTime((int) (System.currentTimeMillis() % movie.duration()));
handler.removeCallbacks(drawGIF);
handler.postDelayed(drawGIF, frameDuration);
}
}
@Override
public void onVisibilityChanged(boolean visible) {
//super.onVisibilityChanged(visible);
this.visible = visible;
if (visible) {
handler.post(drawGIF);
} else {
handler.removeCallbacks(drawGIF);
}
}
@Override
public void onDestroy() {
super.onDestroy();
handler.removeCallbacks(drawGIF);
}
}
}
在这里,我想将.gif图像传递给gif服务
public class LiveViewActivity extends AppCompatActivity {
ImageView imageView;
Button setLiveWallpaper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_live_view);
imageView = findViewById(R.id.viewImage);
Glide.with(this).load(getIntent().getStringExtra("images")).into(imageView);
setLiveWallpaper.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
applyLiveWallpaper();
}
});
}
private void applyLiveWallpaper() {
Intent intent = new Intent(
WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER);
intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT,
new ComponentName(this, GIFWallpaperService.class));
startActivity(intent);
}
}
礼品服务
这里我想接收从LiveViewActivity发送的.gif图像
设置为实时壁纸
public class GIFWallpaperService extends WallpaperService {
@Override
public WallpaperService.Engine onCreateEngine() {
try {
Movie movie = Movie.decodeStream(getResources().getAssets().open("sea_gif.gif")); //Here is the default gif image
return new GIFWallpaperEngine(movie);
} catch (IOException e) {
Log.d("GIFWallpaperService", "Could not loaded live wallpaper");
return null;
}
}
private class GIFWallpaperEngine extends WallpaperService.Engine {
private final int frameDuration = 20;
private SurfaceHolder holder;
private Movie movie;
private boolean visible;
private Handler handler;
public GIFWallpaperEngine(Movie movie) {
this.movie = movie;
handler = new Handler();
}
@Override
public void onCreate(SurfaceHolder surfaceHolder) {
super.onCreate(surfaceHolder);
this.holder = surfaceHolder;
}
private Runnable drawGIF = new Runnable() {
@Override
public void run() {
draw();
}
};
private void draw() {
if (visible) {
Canvas canvas = holder.lockCanvas();
canvas.save();
canvas.scale(4f, 4f);
movie.draw(canvas, -100, 0);
canvas.restore();
holder.unlockCanvasAndPost(canvas);
movie.setTime((int) (System.currentTimeMillis() % movie.duration()));
handler.removeCallbacks(drawGIF);
handler.postDelayed(drawGIF, frameDuration);
}
}
@Override
public void onVisibilityChanged(boolean visible) {
//super.onVisibilityChanged(visible);
this.visible = visible;
if (visible) {
handler.post(drawGIF);
} else {
handler.removeCallbacks(drawGIF);
}
}
@Override
public void onDestroy() {
super.onDestroy();
handler.removeCallbacks(drawGIF);
}
}
}
我不知道如何将.gif图像从
LiveViewActivity
发送和接收到gifwallperservice
尝试使用DomainEventBus,它有助于在所有应用程序中传递对象、图像以及事实上的任何数据类型。
这样,您需要在创建服务时注册“事件总线”,它将能够从应用程序的任何组件接收映像。您的问题对我来说有点模糊,但如果我没弄错,实际上,您可以通过上下文通过适配器轻松地在LiveWallperActivity中获取图片,然后通过此活动,您可以有意地将图像传递给任何您想要的活动 若要将数据从“活动”发送到“服务”,您需要重写OnStart命令,因为您可以直接访问intent:
Override
public int onStartCommand(Intent intent, int flags, int startId) {
然后从LiveViewActivity创建意图对象以启动服务,然后将图像名称放入意图对象中:
Intent serviceIntent = new Intent(YourService.class.getName())
serviceIntent.putExtra("IMAGE_KEY", "image");
context.startService(serviceIntent);
当服务启动时,将调用其onStartCommand()方法,然后您可以获得图像:
public int onStartCommand (Intent intent, int flags, int startId) {
String image = intent.getStringExtra("IMAGE_KEY");
return START_STICKY;
}
首先,我将图像从
livewallparactivity
传递到LiveViewActivity
,在LiveViewActivity
中,我有一个按钮(设置实时墙纸)。我想将图像从LiveViewActivity发送到纸质服务类,当点击按钮时,如果您在LvieViewActivity中有图像,然后需要将其发送到您的服务,您可以有意这样做,请再次检查我的答案。