给指定的view添加边框

在Android开发中,为了给获取焦点的View添加高亮边框,可以通过自定义View实现。文章介绍了具体步骤:1.准备高亮框图片;2.创建继承自View的MyView,并设置图片为背景;3.定义changeFocusPosition方法接收焦点View的位置和大小信息;4.在onDraw方法中更新自定义View的布局参数以显示边框。示例代码展示了如何在焦点改变时调用自定义View的方法并更新边框位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很多时候,我们希望给获取焦点的View添加一个高亮的边框,如下面的途中所示,没有选中的Button是没有高亮框的,选中的则有。

要实现这个效果,这里提供一种方案。

1.首先要有一张如上图顶部一样的图片,该图片用来拉伸后作为高亮框。

2.自定义一个MyView,继承自View,1中所提到的图片就是该View的背景图

3.定义一个public void changeFocusPosition(int x,int y,int width,int height)方法,用来在指定的View获得焦点后调用该方法,传入的是需要高亮框显示的位置和大小,

这些值可以由需要添加高亮框的View的属性获得

4.之后根据3中传入的值来改变MyView的Layout参数。


MyView的基本结构定义如下:

public class MyView extends View {
private int srcLeft, srcTop, srcWidth=20, srcHeight=20;
private int desLeft, desTop, desWidth=20, desHeight=20;

private FrameLayout.LayoutParams frame_p;
    
public MyView(Context context) {
super(context);
}

public void changeFocusPos(int posX, int posY, int destWidth, int destHeight)
{
        desLeft = posX;
        desTop = posY;
        desWidth = destWidth;
        desHeight = destHeight;
        startFocus();
    }

protected void onDraw(Canvas canvas) {
        // 绘制焦点
if(frame_p == null)
frame_p =  (LayoutParams) this.getLayoutParams();
updateRect();
        this.setLayoutParams(frame_p);
}


  private void updateRect()
    {
        frame_p.leftMargin = desLeft ;
        frame_p.topMargin = desTop ;
        frame_p.width = desWidth ;
        frame_p.height = desHeight ;
        frame_p.gravity = Gravity.TOP|Gravity.LEFT; 
    }

  private void startFocus()
 {
        postInvalidate();
    }

}

上面之所以写的绕了些,主要是可以在不同的阶段添加相应的控制,实现各种移动动画效果。


使用:

MyView  mv = new MyView(this);
mv.setBackgroundResource(R.drawable.frame);


public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus == true)
mv.changeFocusPos(v.getLeft(), v.getTop(), v.getWidth(), v.getHeight());
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值