Как программно отобразить изображение с текстовым (или кнопочным, или другим) наложением? - PullRequest
1 голос
/ 20 сентября 2011

У меня есть изображение для отображения через элемент 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);
    } 
}

1 Ответ

1 голос
/ 20 сентября 2011

Вы можете расширить класс представления и переопределить метод ondraw.Используя холст, вы можете нарисовать растровое изображение, а также текст поверх него.

Из того, что я понял, вам нужно, чтобы текст отображался посередине и независимо от вида прокрутки.Это структура пользовательского интерфейса, которую я бы сделал

<FrameLayout>
    <ScrollView>
        <Imageview/>
    </ScrollView>
    <TextView/>
</FrameLayout>

Чтобы создать этот макет программно, это примерно так, как вы делаете.

    ViewGroup.LayoutParams lp = new LayoutParams(LayoutParams.FILL_PARENT, 
            LayoutParams.FILL_PARENT);

    ScrollView sv = new ScrollView(this);
    sv.setLayoutParams(lp);

    TextView tx = new TextView(this);
    tx.setLayoutParams(lp);
    tx.setGravity(Gravity.CENTER);
    tx.setText("Test");

    FrameLayout fr = new FrameLayout(this);        
    fr.setLayoutParams(lp);
    fr.addView(sv);
    fr.addView(tx);
    setContentView(fr);

Приведенный выше код должен идти в onCreateметод.Это просто, как вы делаете это примерно.Вам нужно будет внести некоторые изменения или дополнения, чтобы он работал на вас.

...