如果单击矩形就足够了,那么通过扩展 ImageView 可以很容易地实现。下面是一个简单的实现,不考虑可访问性。
观点:
package com.example.letzterwille.views;
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ImageView;
import java.util.HashMap;
import java.util.Map;
import androidx.annotation.Nullable;
public class ClickableAreaImageView extends ImageView {
Map< Rect, Runnable > areaEffects = new HashMap<>();
public ClickableAreaImageView( Context context ) {
super( context );
}
public ClickableAreaImageView( Context context, @Nullable AttributeSet attrs ) {
super( context, attrs );
}
public ClickableAreaImageView( Context context, @Nullable AttributeSet attrs, int defStyleAttr ) {
super( context, attrs, defStyleAttr );
}
public ClickableAreaImageView( Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes ) {
super( context, attrs, defStyleAttr, defStyleRes );
}
public void addAreaEffect( Rect target, Runnable event ) {
areaEffects.put( target, event );
}
@Override
public boolean onTouchEvent( MotionEvent event ) {
if ( event.getAction() == MotionEvent.ACTION_DOWN ) {
int x = ( int ) event.getX();
int y = ( int ) event.getY();
for ( Map.Entry< Rect, Runnable > entry : areaEffects.entrySet() ) {
Rect rect = entry.getKey();
if ( rect.contains( x, y ) ) entry.getValue().run();
}
}
return super.onTouchEvent( event );
}
}
在您的 XML 或 Java 中,像使用普通 ImageView 一样使用它。
然后,您必须注册点击操作。我想参加特定的活动,在 Kotlin 中看起来像这样:
class MenuSelection : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_menu_selection)
val areaImage = findViewById<ClickableAreaImageView>(R.id.menuSelectionImage)
areaImage.addAreaEffect(Rect(530, 100, 1080, 800), makeRunnable(SettingsActivity::class.java))
areaImage.addAreaEffect(Rect(30, 80, 430, 700), makeRunnable(StatsActivity::class.java))
}
private fun makeRunnable(activity: Class<*>): Runnable {
return Runnable {
val intent = Intent(this, activity)
startActivity(intent)
overridePendingTransition(R.anim.slide_in_from_bottom, R.anim.slide_out_to_top);
}
}
}
一般情况下,通过定义矩形来使用它,当点击矩形时执行一个Runnable,然后通过ClickableAreaImageView.addAreaEffect将它们添加到视图中