如何在android中实现多个屏幕大小的图像区域点击监听器?

时间:2015-01-03 07:54:34

标签: java android image layout

我想创建全屏活动,以全屏加载图片广告。示例图像如下:

enter image description here

请注意,该按钮也是图像的一部分。这是布局xml:

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

</LinearLayout>

您可以看到图片已加载android:background

我想要实现的是:当点击“按钮”图像部分时,它会执行某些操作(例如启动另一个活动),以及点击时右上角的“关闭[X]”矩形,它将关闭活动。

似乎很容易在“Button”绘图的区域部分实现点击逻辑。到目前为止,我找到了两种方法:

  1. 在LinearLayout上设置ontouch侦听器,并检查它的按钮绘制区域的X和Y坐标

  2. 将不可见的ImageView置于布局中“按钮”图像的顶部,并设置onclick侦听器。

  3. 但问题是:在许多Android设备上有多种屏幕尺寸和分辨率。所以我想知道这两种解决方案是否可以在不同的屏幕尺寸上以便携方式使用?

    由于图像在以不同的屏幕分辨率加载时可能会被拉伸,这意味着解决方案#1:我必须调整X&amp; Y号。对于解决方案#2:不可见的ImageView的位置可能会从Button绘图中同步。

    所以任何人都知道更好的解决方案吗?

    更新

    我正在尝试使用隐形点击占位符解决方案。这是布局xml:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/ad_image"
        android:id="@+id/adLayout"
        android:weightSum="1">
    
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0.75"/>
    
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0.16"
            android:id="@+id/adImageLayout"
            android:onClick="adImageClicked">
        </LinearLayout>
    
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"/>
    </LinearLayout>
    

    adImageLayout是按钮绘图的单击占位符。

3 个答案:

答案 0 :(得分:1)

或者为Android支持的每个密度提供image,并添加layout相应地为每个图像定位按钮或者更好,只需使图像的下部区域可点击。 button本身很大,几乎覆盖了下部屏幕的整个区域。如果用户不想点击按钮,则不会尝试点击该按钮。我可以直接告诉你,这就是广告公司在这种情况下所做的事情。

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

   <ImageButton
       android:layout_width="match_parent"
       android:layout_height="120dp"
       android:layout_alignParentBottom="true"
       android:background="#000"
    />
</RelativeLayout>

----更新----

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".MainActivity">

<Button
    android:id="@+id/my_button"
    android:text="My Button"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/black"
    android:textColor="@android:color/white"
    android:gravity="center"
    android:layout_gravity="bottom"
    android:padding="24dp"
    />

</FrameLayout>

public class MainActivity extends Activity {

    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button) findViewById(R.id.my_button);

        final int heightPixels = getResources().getDisplayMetrics().heightPixels;
        button.setTranslationY(- heightPixels / 3 / 2);
    }



}

答案 1 :(得分:1)

我决定回答我的问题。我改进了原来的解决方案:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/ad_image"
    android:weightSum="1">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.7">

        <ImageView
            android:id="@+id/imageView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:src="@drawable/xbutton"
            android:onClick="xButtonClicked"/>
    </LinearLayout>

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.2">

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1.1" />

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="0.3"
            android:onClick="buttonClicked"/>

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"/>
    </LinearLayout>

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

以下是布局的架构:

enter image description here

关闭按钮加载了ImageView。

所以基本上我只是在这里使用layout_weight技巧。我避免使用硬编码的dpi,因为它会在不同的屏幕尺寸下导致不同的LinearLayout的宽度/高度结​​果。

我已经测试了几种屏幕分辨率(平板电脑尺寸除外),它运行正常。我不需要为多个密度提供不同的图像和布局文件。并且Activity类中所需的代码非常小,只有代码来设置全屏:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
                     WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);

onClick事件方法。

当然,如果你能找到更好的解决方案,请告诉我。

答案 2 :(得分:0)

如果您不想使用按钮和视图,您可以在整个屏幕宽度和高度的分数形式中考虑X和Y.

让我们说可点击区域从屏幕宽度的1/3到2/3。然后你可以回想起实际的ScreenWidth(以dp,像素或其他为单位),并在运行时说可点击区域从(1/3)* ScreenWidth变为(2/3)* ScreenWidth。

Ys或关闭按钮相同。然后,设计师将根据这些比率制作背景。