OnFocusChanged方法简介

onFocusChanged只能在View中重写。该方法是焦点改变的回调方法,当某个控件重写了该方法后,当焦点发生变化时,会自动调用该方法来处理焦点改变事件。该方法的签名如下。

protected void onFocusChanged(boolean gainFocus,int direction,Rect previouslyFocusedRect)

参数gainFocus:参数gainFocus表示触发该事件的View是否获得了焦点,当该控件获得焦点时,gainFocus等于true,否则等于false。

参数direction:参数direction表示焦点移动的方向,用数值表示。

参数previouslyFocusedRect:表示触发事件的View的坐标系中,前一个获得焦点的矩形区域,即表示焦点是从哪里来的。如果不可以则为null。

下面是一个简单的例子

其mianActivity的代码如下:

 package com.example.onfocuschanged;


import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.LinearLayout;




public class MainActivity extends Activity {

MyButton myButton01;
MyButton myButton02;
MyButton myButton03;
MyButton myButton04;
MyButton myButton05;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        myButton01=new MyButton(this);
        myButton02=new MyButton(this);
        myButton03=new MyButton(this);
        myButton04=new MyButton(this);
        myButton05=new MyButton(this);
        myButton01.setText("myButton01");
        myButton02.setText("myButton02");
        myButton03.setText("myButton03");
        myButton04.setText("myButton04");
        myButton05.setText("myButton05");
        LinearLayout linearLayout=new LinearLayout(this);
        linearLayout.setOrientation(LinearLayout.VERTICAL);
        linearLayout.addView(myButton01);
        linearLayout.addView(myButton02);
        linearLayout.addView(myButton03);
        linearLayout.addView(myButton04);
        linearLayout.addView(myButton05);
        setContentView(linearLayout);
    }
    class MyButton extends Button{
    public MyButton(Context context){
    super(context);
    }
    protected void onFocusChanged(boolean focused,int direction,Rect previouslyFocusedRect){
    Log.d("Button", this.getText()+",focused="+focused+",direction="+direction+",previouslyFocusedRect"+previouslyFocusedRect);
    super.onFocusChanged(focused, direction, previouslyFocusedRect);
    }
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的示例,演示如何使用 `FocusableOnTouchView` 类来设计一个广告展示的界面: 1. 创建一个 `FocusableOnTouchView` 类的子类 `AdvertisementView`,并在其构造函数中设置 `setClickable(true)`。 ```java public class AdvertisementView extends FocusableOnTouchView { public AdvertisementView(Context context) { super(context); setClickable(true); } // Override onTouchEvent() and onFocusChanged() methods as needed } ``` 2. 在 `AdvertisementView` 类中实现 `onDraw()` 方法,绘制广告的图片和文字信息。 ```java @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // Draw advertisement image Drawable image = getResources().getDrawable(R.drawable.advertisement_image); image.setBounds(0, 0, getWidth(), getHeight()); image.draw(canvas); // Draw advertisement text Paint textPaint = new Paint(); textPaint.setTextSize(20); textPaint.setColor(Color.WHITE); String text = "This is an advertisement"; canvas.drawText(text, getWidth() / 2, getHeight() / 2, textPaint); } ``` 3. 在布局文件中添加 `AdvertisementView` 控件,并使用 `ViewGroup` 类(如 `LinearLayout` 或 `RelativeLayout`)将多个 `AdvertisementView` 控件组合在一起。 ```xml <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <com.example.AdvertisementView android:layout_width="match_parent" android:layout_height="100dp" android:focusable="true" android:focusableInTouchMode="true" /> <com.example.AdvertisementView android:layout_width="match_parent" android:layout_height="100dp" android:focusable="true" android:focusableInTouchMode="true" /> <!-- Add more AdvertisementView controls as needed --> </LinearLayout> ``` 4. 在 `Activity` 类中实现 `View.OnFocusChangeListener` 接口,并将其注册到 `AdvertisementView` 控件中。 ```java public class MainActivity extends AppCompatActivity implements View.OnFocusChangeListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Register onFocusChangeListener to all AdvertisementView controls ViewGroup advertisementContainer = findViewById(R.id.advertisement_container); for (int i = 0; i < advertisementContainer.getChildCount(); i++) { View childView = advertisementContainer.getChildAt(i); if (childView instanceof AdvertisementView) { childView.setOnFocusChangeListener(this); } } } // Implement onFocusChange() method to handle focus change events @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { // Handle advertisement focus change event } } } ``` 这样,您就可以使用 `AdvertisementView` 类来创建一个简单的广告展示界面,并在 `Activity` 类中处理焦点变化事件。当用户聚焦到某个广告控件上时,您可以根据需要执行一些操作,例如打开一个链接或显示更多的广告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值