Android TV控件获得焦点的扫光效果

目录

 

前言

效果展示

实现思路

使用方法

完成的源码和demo


前言

Android TV开发与手机开发最大的不同点就是焦点,TV常用的操作方式是遥控器,所以给用户一个醒目美观的焦点是至关重要的。很多产品经理在设计焦点的时候都会选择扫光的效果,比如小牧电视的控件选中效果。今天就给大家介绍一款自定义的扫光效果控件。

效果展示

1、海报扫光效果

2、带圆角的控件扫光效果,光效不会超过圆角的位置

3、扫光容器,可以在扫光容器中放子控件,目前仅实现了LinearLayout

4、图片扫光效果,光效与图片中不透明内容交融的一种效果

实现思路

这一组控件的实现思路,其实很简单,就是光效bitmap的移动,可以是移动画布,也可以是移动bitmap,两种思路都可以实现。当然其中在实现圆角扫光、光效与图片内容交融等效果时,用到一个比较重要的知识点,就是PorterDuffXfermode。具体介绍Xfermode或者PorterDuffXfermode的文章可以去网上搜一下,有很多。简单讲PorterDuffXfermode是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互。

PorterDuffXfermode的风格就是上面的16中,我们可以简单的理解为一个SRC图形与DST图形的交集,并集类似的效果,在我们这组控件中,主要用到了DST_ATOP、DST_IN。详细使用方法可参考控件源码。

使用方法

首先需要引入library:

implementation 'com.beauney.scanning:scanning-view:1.0.1'

1、海报斜向的扫光效果控件使用

xml中使用控件:

    <FrameLayout
        android:layout_width="283dp"
        android:layout_height="159dp"
        android:layout_marginStart="20dp"
        android:layout_marginTop="20dp"
        android:focusable="true"
        android:focusableInTouchMode="true">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/temp_demand_3" />

        <com.beauney.scanning.library.ScanningView
            android:tag="scanning_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#66000000"/>
    </FrameLayout>

java代码中调用start()、stop()方法:

        RelativeLayout container = findViewById(R.id.container);

        for (int i = 0; i < container.getChildCount(); i++) {
            container.getChildAt(i).setOnFocusChangeListener(new View.OnFocusChangeListener() {
                @Override
                public void onFocusChange(View view, boolean b) {
                    ScanningView scanningView = view.findViewWithTag("scanning_view");
                    if (b) {
                        AnimatorUtil.scaleBigAnimator(view);
                        scanningView.start();
                    } else {
                        AnimatorUtil.scaleSmallAnimator(view);
                        scanningView.stop();
                    }
                }
            });
        }

该控件提供了自定义属性lightImage,可以自定义更换光效图片:

        <com.beauney.scanning.library.ScanningView
            android:tag="scanning_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:lightImage="@drawable/scanning_view_light"
            android:background="#66000000"/>

图片制作参考默认扫光图片

2、带圆角的竖向扫光效果控件使用

xml中使用控件:

    <FrameLayout
        android:id="@+id/next_text_container"
        android:layout_width="334dp"
        android:layout_height="73dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="60dp">

        <View
            android:id="@+id/next_text_bg"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/ad_text_bg_shape" />

        <TextView
            android:id="@+id/next_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="18dp"
            android:clickable="true"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:text="按OK键进入下一步"
            android:textColor="#dddddd"
            android:textSize="18sp" />

        <ProgressBar xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/video_progress_bar"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="294dp"
            android:layout_height="10dp"
            android:layout_gravity="bottom"
            android:layout_marginBottom="14dp"
            android:layout_marginStart="20dp"
            android:background="@null"
            android:progress="100"
            android:progressDrawable="@drawable/ad_progress_selector"/>

        <com.beauney.scanning.library.ScanningRoundView
            android:id="@+id/scanning_round_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </FrameLayout>

java代码中调用start()、stop()方法:

mScanningRoundView.start();

mScanningRoundView.stop();

该控件提供了两个自定义属性,用于修改光效图片和圆角角度,参考如下代码:

        <com.beauney.scanning.library.ScanningRoundView
            android:id="@+id/scanning_round_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:roundRadius="10dp"
            app:roundLightImage="@drawable/round_light"/>

图片制作参考默认扫光图片,这里没有采用9patch的图片,所以控件高度要和光效图片的高度一致。

3、带圆角的扫光容器使用

xml中使用控件:

    <com.beauney.scanning.library.ScanningLinearLayout
        android:id="@+id/scanning_container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="30dp">

        <TextView
            android:id="@+id/language_cn_btn"
            android:layout_width="127dp"
            android:layout_height="27dp"
            android:clickable="true"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:gravity="center"
            android:text="中文"
            android:textColor="#999999"
            android:background="@drawable/language_cn_nor"
            android:textSize="18sp" />

        <TextView
            android:id="@+id/language_en_btn"
            android:layout_width="127dp"
            android:layout_height="27dp"
            android:clickable="true"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:gravity="center"
            android:text="English"
            android:background="@drawable/language_en_sel"
            android:textColor="#ffffff"
            android:textSize="18sp" />
    </com.beauney.scanning.library.ScanningLinearLayout>

 java代码中调用start()、stop()方法:

mScanningLayout.start();
mScanningLayout.stop();

 同样提供了两个自定义属性,用于修改光效图片和圆角角度,参考如下代码:

    <com.beauney.scanning.library.ScanningLinearLayout
        android:id="@+id/scanning_container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layoutRadius="10dp"
        app:layoutLightImage="@drawable/layount_light"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="30dp">
    </com.beauney.scanning.library.ScanningLinearLayout>

 图片制作参考默认扫光图片,这里没有采用9patch的图片,所以控件高度要和光效图片的高度一致。

4、图片扫光效果控件使用

xml中使用控件:

    <FrameLayout
        android:layout_width="83dp"
        android:layout_height="63dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="60dp"
        android:layout_gravity="center_horizontal">

        <ImageView
            android:id="@+id/icon_img"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:contentDescription="aaaa"
            android:src="@drawable/icon_choose_sel" />

        <com.beauney.scanning.library.ScanningImageView
            android:id="@+id/scanning_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </FrameLayout>

java代码中调用相关方法

    public void startScanning(View view) {
        //启动控件动效之前需要将原始的图片传入
        if (mScanningImageView.getSrcBitmap() == null) {
            mScanningImageView.setSrcBitmap(ScreenCapture.captureWidget(mIconImg));
        }
        mScanningImageView.start();
    }

    public void stopScanning(View view) {
        mScanningImageView.stop();
    }

该控件提供了一个自定义属性,用于修改光效颜色,参考如下代码:

        <com.beauney.scanning.library.ScanningImageView
            android:id="@+id/scanning_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" 
            app:lightColor="@color/colorAccent"/>

完成的源码和demo

Github地址

 

 

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要实现 Android 图片扫光效果,可以通过以下步骤: 1. 创建一个 ImageView 控件,在其中加载要显示的图片。 2. 创建一个线性渐变的 Shader 对象,用于实现扫光效果。可以使用 LinearGradient 类来创建该对象。 3. 创建一个 Paint 对象,设置其 Shader 为线性渐变的 Shader 对象,然后设置其 Xfermode 为 SRC_IN,这样可以让扫光只显示在图片的区域内。 4. 在 ImageView 控件的 onDraw() 方法中,使用 Canvas 对象绘制图片和扫光效果。首先绘制图片,然后再使用 Paint 对象绘制扫光效果。 下面是一个示例代码,实现了从左到右的扫光效果: ```java public class SweepImageView extends ImageView { private Paint mPaint; private LinearGradient mShader; private int mSweepWidth; public SweepImageView(Context context, AttributeSet attrs) { super(context, attrs); mSweepWidth = getWidth() / 5; int[] colors = {0x00000000, 0xff000000, 0xff000000, 0x00000000}; float[] positions = {0f, 0.3f, 0.7f, 1f}; mShader = new LinearGradient(0, 0, mSweepWidth, 0, colors, positions, Shader.TileMode.CLAMP); mPaint = new Paint(); mPaint.setShader(mShader); mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.save(); canvas.translate(-mSweepWidth, 0); canvas.drawRect(0, 0, mSweepWidth, getHeight(), mPaint); canvas.restore(); } } ``` 在该示例代码中,创建了一个 LinearGradient 对象,使用了四个颜色值,分别表示透明、黑色、黑色和透明。其中,0x00000000 表示透明,0xff000000 表示黑色。使用了一个 float 类型的数组 positions,来指定每个颜色值所占的位置。在 Paint 对象中,设置了 Shader 为线性渐变的 Shader 对象,设置了 Xfermode 为 SRC_IN,这样可以让扫光只显示在图片的区域内。在 onDraw() 方法中,使用 Canvas 对象绘制图片和扫光效果,首先绘制图片,然后再使用 Paint 对象绘制扫光效果。通过调用 canvas.save() 和 canvas.restore() 方法,可以保证绘制完扫光效果后,画布的状态不会影响到后续的绘制操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值