У меня есть изображение для отображения через элемент ImageView. Основываясь на пользовательском вводе (скажем, долгое нажатие), я захочу наложить что-то на это изображение так, чтобы наложение было в середине экрана (или где-то, кроме верхнего левого угла по крайней мере ... но клавиша это то, что оно накладывается на изображение, и я могу выбрать это место в коде. Это может быть информативный элемент TextView (но не Toast) или некоторые эфемерные кнопки масштабирования).
В конечном итоге все это будет потомком ScrollView какого-то вида (вероятно, TwoDScrollView , но если у вас есть более подходящее предложение, дайте мне знать), поэтому любой текст или кнопка, которые будут вставлены, не должны исключать, что возможность. WebView не вариант, хотя. Вероятно, я бы использовал RelativeLayout, если у вас нет лучшего предложения.
Я хочу сделать это программно, а не в XML. Я не ожидаю полной программы от кого-либо (если она еще не существует ... Я еще не нашел ее). Мне просто нужен четкий план того, как это сделать правильно для текста над изображением.
Редактировать: Я искал весь день и нашел много идей, но они либо только для XML, либо полностью отличаются от того, что я пытаюсь сделать здесь. Однако, если у вас есть указатель на что-то подходящее, пожалуйста, дайте мне знать!
Редактировать 2: Вот рабочий пример, который я создал, который выполняет то, что я намеревался выполнить. Надеюсь, это будет полезно для других! animage1 - изображение размером 1000x1000 пикселей ... дело в том, что он больше, чем используемый вами экран. animage2 является относительно небольшим (100x100px). «Меню» перегружено для переключения видимости этого второго изображения в качестве подтверждения концепции.
package com.myname.testoverlay2;
//import android.widget.HorizontalScrollView; // Works with this as well
import com.myname.testoverlay2.TwoDScrollView;
// From - http://blog.gorges.us/2010/06/android-two-dimensional-scrollview/
// with fix added from comments there
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.ViewGroup.LayoutParams;
import android.widget.FrameLayout;
import android.widget.ImageView;
public class Testoverlay2Activity extends Activity {
private static final String TAG = "MyApp";
ImageView iv2;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FrameLayout fl1 = new FrameLayout(this);
FrameLayout.LayoutParams flp1 = new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
fl1.setId(9001);
fl1.setLayoutParams(flp1);
TwoDScrollView sv1 = new TwoDScrollView(this);
sv1.setId(9002);
FrameLayout fl2 = new FrameLayout(this);
FrameLayout.LayoutParams flp2 = new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
fl2.setId(9003);
fl2.setLayoutParams(flp2);
ImageView iv1 = new ImageView(this);
FrameLayout.LayoutParams ivp1 = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
iv1.setId(9004);
iv1.setLayoutParams(ivp1);
Bitmap bm1 = BitmapFactory.decodeResource(getResources(),
getResources().getIdentifier("animage1" , "drawable", getPackageName()));
iv1.setImageBitmap(bm1);
//Log.d(TAG, "Bitmap1 = (" + bm1.getWidth() + ", " + bm1.getHeight() + ")");
iv2 = new ImageView(this);
FrameLayout.LayoutParams ivp2 = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, Gravity.CENTER);
iv2.setId(9005);
iv2.setLayoutParams(ivp2);
Bitmap bm2 = BitmapFactory.decodeResource(getResources(),
getResources().getIdentifier("animage2" , "drawable", getPackageName()));
iv2.setImageBitmap(bm2);
//Log.d(TAG, "Bitmap2 = (" + bm2.getWidth() + ", " + bm2.getHeight() + ")");
// Lay everything out
fl1.addView(sv1);
fl1.addView(iv2);
sv1.addView(fl2);
fl2.addView(iv1);
setContentView(fl1);
// The following is based on a StackOverflow comment that scrollTo won't work immediately, in general...
// /2670566/horizontalscrollview-avtomaticheskaya-prokrutka-do-kontsa-pri-dobavlenii-novyh-vidov
Handler mHandler = new Handler();
mHandler.postDelayed(new Runnable() {
public void run() {
TwoDScrollView container=(TwoDScrollView)findViewById(9002);
if (container != null) {
Log.d(TAG, "executing scrollTo()");
//container.setOverScrollMode(TwoDScrollView.OVER_SCROLL_IF_CONTENT_SCROLLS); // Needed?
container.scrollTo(500,500);
}
else {
Log.d("MyApp", "Container is null");
}
}
}, 100L);
}
// Keyboard wedge for testing convenience
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
Log.d(TAG, "Keypress = (" + keyCode + ")");
switch (keyCode) {
case KeyEvent.KEYCODE_MENU:
/* Sample for handling the Menu button globally */
if (iv2.getVisibility() == ImageView.VISIBLE) {
iv2.setVisibility(ImageView.INVISIBLE);
}
else {
iv2.setVisibility(ImageView.VISIBLE);
}
return true;
}
return super.onKeyDown(keyCode, event);
}
}