有任何方法可以将Imageview设置为背景,并在该Imageview上显示按钮和文本



你好,朋友们,我想将图像视图设置为背景,并在该图像上显示我的按钮和文本视图。。我希望我的图像视图在背景中,并像背景一样覆盖所有屏幕。。按钮和图像视图将显示在该图像视图上请帮助我是新人提前感谢帮助我正在使用ImageLoader.class从Url 获取图像

这是我的布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<!-- <Button
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/sendmessage"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="29dp"
    android:text="Button" 
    android:visibility="gone"/> -->

<Button
    android:id="@+id/button1"
    android:layout_width="80dp"
    android:layout_height="100dp"
    android:layout_above="@+id/anim"
    android:layout_toLeftOf="@+id/anim"
    android:background="@drawable/icon_msg" 
   android:visibility="gone" />
<Button
    android:id="@+id/button3"
    android:layout_width="80dp"
    android:layout_height="100dp"
    android:layout_alignBaseline="@+id/button1"
    android:layout_alignBottom="@+id/button1"
    android:layout_toRightOf="@+id/anim"
    android:background="@drawable/icon_favorit"
    android:text=""
    android:visibility="gone" />
<Button
    android:id="@+id/addfrnd"
    android:layout_width="80dp"
    android:layout_height="100dp"
    android:layout_alignBottom="@+id/button1"
    android:layout_marginBottom="31dp"
    android:layout_toRightOf="@+id/button1"
    android:background="@drawable/icon_frndreq"
    android:visibility="gone" />
<Button
    android:id="@+id/anim"
    android:layout_width="90dp"
    android:layout_height="110dp"
    android:layout_alignBottom="@+id/imageView1"
    android:layout_centerHorizontal="true"
    android:background="@drawable/anim_button"
    android:text="animation" />
<ImageView
    android:id="@+id/imageView1"
    android:layout_width="fill_parent"
    android:layout_height="600dp"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:src="@drawable/loader" />

我的ImageLoader类

public class ImageLoader {
// the simplest in-memory cache implementation. This should be replaced with
// something like SoftReference or BitmapOptions.inPurgeable(since 1.6)
private HashMap<String, Bitmap> cache = new HashMap<String, Bitmap>();
private File cacheDir;
static ArrayList<String> img_path = new ArrayList<String>();
static String sd_card_folder_name = "ImageLoader";
static int width;
Context mContext;
public ImageLoader(Context context, Activity acc) {
    mContext = context;
    // Make the background thead low priority. This way it will not affect
    // the UI performance
    photoLoaderThread.setPriority(Thread.NORM_PRIORITY - 1);
    DisplayMetrics displaymetrics = new DisplayMetrics();
    acc.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
    width = displaymetrics.widthPixels;
    Log.d("width", "width = " + width);
    cache.clear();
    img_path = new ArrayList<String>();
    // Find the dir to save cached images
    if (android.os.Environment.getExternalStorageState().equals(
            android.os.Environment.MEDIA_MOUNTED))
        cacheDir = new File(android.os.Environment
                .getExternalStorageDirectory(), sd_card_folder_name);
    else
        cacheDir = context.getCacheDir();
    if (!cacheDir.exists())
        cacheDir.mkdirs();
}
final int stub_id = R.drawable.loader;
public void DisplayImage(String url, Activity activity, ImageView imageView) {
    try {
        String filename = String.valueOf(url.hashCode());
        File[] file_array = cacheDir.listFiles();
        for (int i = 0; i < file_array.length; i++) {
            img_path.add(file_array[i].getName());
        }
        if (img_path.contains(filename)) {
            imageView.setImageBitmap(BitmapFactory
                    .decodeFile("/mnt/sdcard/" + sd_card_folder_name + "/"
                            + filename));
        } else {
            if (cache.containsKey(url)) {
                imageView.setImageBitmap(cache.get(url));
            } else {
                queuePhoto(url, activity, imageView, filename);
                imageView.setImageResource(stub_id);
            }
        }
    } catch (Exception e) {
        // TODO: handle exception
    }
}
private void queuePhoto(String url, Activity activity, ImageView imageView, String _name) {
    // This ImageView may be used for other images before. So there may be
    // some old tasks in the queue. We need to discard them.
    photosQueue.Clean(imageView);
    PhotoToLoad p = new PhotoToLoad(url, imageView, _name);
    synchronized (photosQueue.photosToLoad) {
        photosQueue.photosToLoad.push(p);
        photosQueue.photosToLoad.notifyAll();
    }
    // start thread if it's not started yet
    if (photoLoaderThread.getState() == Thread.State.NEW)
        photoLoaderThread.start();
}
private Bitmap getBitmap(String url) {
    // I identify images by hashcode. Not a perfect solution, good for the
    // demo.
    if (url != null && !(url.equals(""))) {
        String filename = String.valueOf(url.hashCode());
        File f = new File(cacheDir, filename);
        /*
         * // from SD cache Bitmap b = decodeFile(f); if (b != null) return
         * b;
         */
        // from web
        try {
            Bitmap bitmap = null;
            InputStream is = new URL(url).openStream();
            OutputStream os = new FileOutputStream(f);
            Utils.CopyStream(is, os);
            os.close();
            bitmap = decodeFile(f);
            return bitmap;
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }
    return null;
}
// decodes image and scales it to reduce memory consumption
private Bitmap decodeFile(File f) {
    try {
        // decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(new FileInputStream(f), null, o);
        // Find the correct scale value. It should be the power of 2.
         final int REQUIRED_SIZE=300;
            int width_tmp=o.outWidth, height_tmp=o.outHeight;
            int scale=1;
            while(true){
                if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
                    break;
                width_tmp/=2;
                height_tmp/=2;
                scale*=2;
            }
        // decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
    } catch (FileNotFoundException e) {
    }
    return null;
}
// Task for the queue
private class PhotoToLoad {
    public String url;
    public ImageView imageView;
    public String _name;
    public PhotoToLoad(String u, ImageView i, String n) {
        url = u;
        imageView = i;
        _name = n;
    }
}
PhotosQueue photosQueue = new PhotosQueue();
public void stopThread() {
    photoLoaderThread.interrupt();
}
// stores list of photos to download
class PhotosQueue {
    private Stack<PhotoToLoad> photosToLoad = new Stack<PhotoToLoad>();
    // removes all instances of this ImageView
    public void Clean(ImageView image) {
        for (int j = 0; j < photosToLoad.size();) {
            if (photosToLoad.get(j).imageView == image)
                photosToLoad.remove(j);
            else
                ++j;
        }
    }
}
class PhotosLoader extends Thread {
    public void run() {
        try {
            while (true) {
                // thread waits until there are any images to load in the
                // queue
                if (photosQueue.photosToLoad.size() == 0)
                    synchronized (photosQueue.photosToLoad) {
                        photosQueue.photosToLoad.wait();
                    }
                if (photosQueue.photosToLoad.size() != 0) {
                    PhotoToLoad photoToLoad;
                    synchronized (photosQueue.photosToLoad) {
                        photoToLoad = photosQueue.photosToLoad.pop();
                    }
                    Bitmap bmp = getBitmap(photoToLoad.url);
                    cache.put(photoToLoad.url, bmp);
                    Object tag = photoToLoad.imageView.getTag();
                    String FileName = photoToLoad._name;
                    if (FileName != null
                            && ((String) FileName).equals(photoToLoad._name)) {
                        BitmapDisplayer bd = new BitmapDisplayer(bmp,
                                photoToLoad.imageView, FileName);
                        Activity a = (Activity) photoToLoad.imageView
                                .getContext();
                        a.runOnUiThread(bd);
                    }
                }
                if (Thread.interrupted())
                    break;
            }
        } catch (InterruptedException e) {
            // allow thread to exit
        }
    }
}
PhotosLoader photoLoaderThread = new PhotosLoader();
// Used to display bitmap in the UI thread
class BitmapDisplayer implements Runnable {
    Bitmap bitmap;
    ImageView imageView;
    String file_name;
    public BitmapDisplayer(Bitmap b, ImageView i, String _name) {
        bitmap = b;
        imageView = i;
        file_name = _name;
    }
    public void run() {
        if (bitmap != null) {
            load_full_image(imageView, file_name, bitmap);
        } else
            imageView.setImageResource(stub_id);
    }
}
private Runnable mMyRunnable = new Runnable() {
    @Override
    public void run() {
    }
};
public void load_full_image(ImageView img, String _name, Bitmap btmp) {
    img_path = new ArrayList<String>();
    File[] file_array = cacheDir.listFiles();
    for (int i = 0; i < file_array.length; i++) {
        img_path.add(file_array[i].getName());
    }
    if (img_path.contains(_name)) {
        Drawable d = new BitmapDrawable(mContext.getResources(),BitmapFactory
                            .decodeFile("/mnt/sdcard/" + sd_card_folder_name + "/"
                                    + _name));
         img.setBackground(d);
    } else {
        Drawable d = new BitmapDrawable(mContext.getResources(),btmp);
        img.setBackground(d);
    }
}
public void clearCache() {
    // clear memory cache
    cache.clear();
    // clear SD cache
    File[] files = cacheDir.listFiles();
    for (File f : files)
        f.delete();
}

我的Activyt类

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
setContentView(R.layout.userprofile);
Button addfrnd=(Button)findViewById(R.id.addfrnd);
ImageView image = (ImageView) findViewById(R.id.imageView1);
UserModel user = (UserModel) getIntent().getSerializableExtra("User");
 UserByIdModel tempuser = (UserByIdModel) getIntent().getSerializableExtra("UserById");
String UserId=String.valueOf(tempuser.getUser_Id());
String image_url=tempuser.getUser_Image();
int loader = R.drawable.loader;
ImageLoader imgLoader = new ImageLoader(getApplicationContext(),
        UserByIdProfile.this);
//
image.setTag(image_url);
  // whenever you want to load an image from url
 // call DisplayImage function
 // url - image url to load
// loader - loader image, will be displayed before getting image
 // image - ImageView 
imgLoader.DisplayImage(image_url, UserByIdProfile.this, image);

不确定我是否理解了所有内容,但IMO您应该尝试将图像设置为RelativeLayout的背景,因为目前您的ImageView是最后绘制的,因此它将显示在的所有内容之上

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/loader" >

然后在RelativeLayout中添加所有内容,就像您所做的那样;(

希望它能有所帮助!

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:background="@drawable/your_image_name"
android:layout_height="match_parent" >

<Button
    android:id="@+id/button1"
    android:layout_width="80dp"
    android:layout_height="100dp"
    android:layout_above="@+id/anim"
    android:layout_toLeftOf="@+id/anim"
    android:background="@drawable/icon_msg" 
   android:visibility="gone" />
<Button
    android:id="@+id/button3"
    android:layout_width="80dp"
    android:layout_height="100dp"
    android:layout_alignBaseline="@+id/button1"
    android:layout_alignBottom="@+id/button1"
    android:layout_toRightOf="@+id/anim"
    android:background="@drawable/icon_favorit"
    android:text=""
    android:visibility="gone" />
<Button
    android:id="@+id/addfrnd"
    android:layout_width="80dp"
    android:layout_height="100dp"
    android:layout_alignBottom="@+id/button1"
    android:layout_marginBottom="31dp"
    android:layout_toRightOf="@+id/button1"
    android:background="@drawable/icon_frndreq"
    android:visibility="gone" />
<Button
    android:id="@+id/anim"
    android:layout_width="90dp"
    android:layout_height="110dp"
    android:layout_alignBottom="@+id/imageView1"
    android:layout_centerHorizontal="true"
    android:background="@drawable/anim_button"
    android:text="animation" />
<ImageView
    android:id="@+id/imageView1"
    android:layout_width="fill_parent"
    android:layout_height="600dp"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:src="@drawable/loader" />
</RelativeLayout>

试试这个动态

public void changeBackground(RelativeLayout relativeLayout, BitmapDrawable drawable){
        relativeLayout.setBackground(drawable);
}
//To download an image and set it as content for an imageview
try {
  ImageView i = (ImageView)findViewById(R.id.image);
  Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(imageUrl).getContent());
  i.setImageBitmap(bitmap); 
} catch (MalformedURLException e) {
  e.printStackTrace();
} catch (IOException e) {
  e.printStackTrace();
}

确保您在Manifest.xml 中拥有互联网权限

<uses-permission android:name="android.permission.INTERNET" />

尝试使用AsyncTask调用,因为我们正在执行网络操作

如果您想以编程方式设置RelativeLayout,以获取其id和setBackgroundResource(yourImage)

要使用单个背景显示的视图。将它们放在RelativeLayout中,并设置android:background="@drawable/SingleBgImageForViewsInsideRelativeLayout"

最新更新