1. 程式人生 > >Android TV自定義處理焦點控制元件

Android TV自定義處理焦點控制元件

Android stuido有android tv專案模板,有一套規則,如果想開發TV版專案可以按照那個模板來,不過那個模板定製性太強。tv版app和其他app有一點不同,就是用遙控器進行操作,所以要想按照自己需求來開發,就要處理好焦點事件。
其實也不復雜,只要繼承現有的控制元件,在onFocusChanged事件中,對自己的需求進行定製就可以了。提供幾個例子:
1.顯示圖片的控制元件,預設載入預設圖片,當獲得焦點以後,切換選中圖片,失去焦點,切換預設圖片

public class FocusImageView extends ImageButton
{
    private int
defaultImageResources = -1; private int focusImageResources = -1; public FocusImageView(Context context) { super(context); } public FocusImageView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public FocusImageView(Context context, AttributeSet attrs, int
defStyle) { super(context, attrs, defStyle); setAttributeSet(attrs); } @Override protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) { super.onFocusChanged(gainFocus, direction, previouslyFocusedRect); if (gainFocus) { if
(focusImageResources != -1) { setBackgroundResource(focusImageResources); } } else { if (defaultImageResources != -1) { setBackgroundResource(defaultImageResources); } } } private void setAttributeSet(AttributeSet attrs) { if (attrs != null) { TypedArray typeArray = getContext().obtainStyledAttributes(attrs, R.styleable.FocusImageView); defaultImageResources = typeArray.getResourceId(R.styleable.FocusImageView_defaultImageResources, -1); focusImageResources = typeArray.getResourceId(R.styleable.FocusImageView_focusImageResources, -1); if (defaultImageResources != -1) { setBackgroundResource(defaultImageResources); } } } }

attrs.xml

<resources>

    <declare-styleable name="FocusImageView">
        <attr name="defaultImageResources" format="integer" />
        <attr name="focusImageResources" format="integer" />
    </declare-styleable>

</resources>

佈局檔案引用:

<專案的包名.widget.focusview.FocusImageView
                    android:id="@+id/iv_wulianwang"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    app:defaultImageResources="@mipmap/wulianwangdefault"
                    app:focusImageResources="@mipmap/wulianwangselected">
</專案的包名.widget.focusview.FocusImageView>

當然,如果只是在獲取焦點和失去焦點,切換圖片,可以定義selector,在drawable下,定義一個selector

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@mipmap/bingliselected" android:state_focused="true" />
    <item android:drawable="@mipmap/binglidefault" />
</selector>

然後在佈局中呼叫

<LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_margin="6dp"
                    android:focusable="true"
                    android:background="@drawable/focus_selector">

2.一個佈局,內部控制元件獲得焦點,可以放大,失去焦點,內部控制元件可以縮小:

public class FocusRelativeLayout extends RelativeLayout {

    private Animation scaleSmallAnimation;
    private Animation scaleBigAnimation;

    public FocusRelativeLayout(Context context) {
        super(context);
    }

    public FocusRelativeLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public FocusRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
        super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
        if (gainFocus) {
            zoomOut();
        } else {
            zoomIn();
        }
    }

    private void zoomIn() {
        if (scaleSmallAnimation == null) {
            scaleSmallAnimation = AnimationUtils.loadAnimation(getContext(), R.anim.anim_scale_small);
        }
        startAnimation(scaleSmallAnimation);
    }

    private void zoomOut() {
        if (scaleBigAnimation == null) {
            scaleBigAnimation = AnimationUtils.loadAnimation(getContext(), R.anim.anim_scale_big);
        }
        startAnimation(scaleBigAnimation);
    }
}

anim_scale_big.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true"
    android:shareInterpolator="false">
    <scale
        android:duration="350"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:pivotX="50.0%"
        android:pivotY="50.0%"
        android:repeatCount="0"
        android:toXScale="1.08"
        android:toYScale="1.08" />
</set>

anim_scale_small.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true"
    android:shareInterpolator="false">
    <scale
        android:duration="350"
        android:fromXScale="1.08"
        android:fromYScale="1.08"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:pivotX="50.0%"
        android:pivotY="50.0%"
        android:repeatCount="0"
        android:toXScale="1.0"
        android:toYScale="1.0" />
</set>

佈局檔案引用:

 <包名.view.FocusRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                                     android:layout_width="wrap_content"
                                                     android:layout_height="wrap_content"
                                                     android:background="#424242"
                                                     android:clipChildren="true"
                                                     android:focusable="true">

        <ImageView
                android:layout_width="100dp"
                android:layout_height="100dp"
                android:scaleType="fitXY"
                android:src="@drawable/pic2"
                android:layout_margin="5dp"/>
    </包名.view.FocusRelativeLayout>

3.進入介面,讓某個控制元件獲取焦點
根據需求,可能對進入介面,首先選中哪個控制元件有需求,可以在佈局檔案裡邊,使用<requestFocus/>屬性

  <包名.widget.focusview.FocusImageView
                    android:id="@+id/iv_bingli"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    app:defaultImageResources="@mipmap/binglidefault"
                    app:focusImageResources="@mipmap/bingliselected"
            >
                <requestFocus></requestFocus>
            </包名.widget.focusview.FocusImageView>

相關推薦

Android TV定義處理焦點控制元件

Android stuido有android tv專案模板,有一套規則,如果想開發TV版專案可以按照那個模板來,不過那個模板定製性太強。tv版app和其他app有一點不同,就是用遙控器進行操作,所以要想按照自己需求來開發,就要處理好焦點事件。 其實也不復雜,只

Android定義滑動選中控制元件WheelView

WheelView a great functional custom WheelView with demo in dialog and bottomDialog,android 滾動選擇控制元件,滾動選擇器 ========= How to

《第一行程式碼Android》學習總結第三章 定義佈局與控制元件

1、View是Android中最基本的元件,它可以在螢幕上繪製一塊矩形區域,並在這塊區域內響應各種事件。所有控制元件都直接或間接繼承自View。 2、ViewGroup是一種特殊的View,可以包含很多子View和子ViewGroup,是一個用於放置控制元件和佈局的容器。所有佈局都直接或間

Android定義標籤列表控制元件LabelsView

無論是在移動端的App,還是在前端的網頁,我們經常會看到下面這種標籤的列表效果: 標籤從左到右擺放,一行顯示不下時自動換行。這樣的效果用Android源生的控制元件很不好實現,所以往往需要我們自己去自定義控制元件。我在開發中就遇到過幾次要實現這樣的標籤列表效果,所以就自己寫了個控制元件,放到我的

android定義星級評分控制元件,可實現只顯示實心星星

話不多說,上圖 近日app需求弄一個等級展示,看了下UI圖,只顯示實星(點亮的星星).如圖 但是網上關於星級評分的例子大多這樣 也展示虛心星星 通過自定義View package com.starsbar; import android.content.C

Android-定義星星評分控制元件RatingBar

星級評分條RatingBar類似於SeekBar、ProgressBar'等等都可以自定義樣式 它的主要用途就比如淘寶、景點 滿意度等 這裡給出兩種自定義效果 如圖所示 第一種是通過RatingBar獲得分數 第二個是通過RatingBar動態調節控制元件屬性(透明度) 由

Android定義View實戰】之定義評價打分控制元件RatingBar,可以定義星星大小和間距

在Android開發中,我們經常會用到對商家或者商品的評價,運用星星進行打分。然而在Android系統中自帶的打分控制元件,RatingBar特別不好用,間距和大小無法改變。所以,我就自定義了一個特別好用的打分控制元件。在專案中可以直接使用,特別簡

android:定義view--組合控制元件

專案中用到了很多類似的介面,一行左右兩邊都是顯示文字,數量非常多; 如果按照普通的方法畫肯定也能非常輕鬆的畫出來,但是因為使用地方較多,為了後期維護,程式碼的簡介,提高開發效率,簡單易用等等:可以自定義一個組合控制元件; 自定義組合控制元件使用起來非常方便,建立也非常的簡

Android定義水平日曆控制元件

ZzHorizontalCalenderView A horizontal and scrollable CalenderView. Gradle: compile 'me.zhouzhu

Android 定義View一個控制元件搞定多種水波紋漣漪擴散效果

效果圖 實現思路 這個效果實現起來並不難,重要的是思路 此View滿足了多種水波紋漣漪擴散效果,這要求它能滿足很多的變化 根據上面的樣式,可以看出此View需要滿足以下變化 圓圈從中心可迴圈向外擴散 圓圈之間的擴散間距可以改變 可控制擴散圓的

Android實現定義相機系列(1)—定義view裁剪控制元件

目標 本系列文章主要記錄自定義相機拍照系列,專案原始碼還在編寫中,後續會傳到github,內容包括: 1、使用Android的Camera API自定義拍照模式,例如人臉拍照,OCR拍照等; 2、對拍完的照片進行裁剪; 3、自定義圖片伸縮view,使用手勢對圖

Android 定義價格日曆控制元件

介紹 上個星期專案有一個日曆價格的需求,類似一個商品在不同的日期價格可能會不同,由於時間給得特別緊所以打算找個合適的開源專案進行修改。參考了網上大多數是通過繼承view直接draw一個monthView,然後通過listview來實現monthView的複用。

Android安卓定義圓角矩形控制元件,省去定義drawable裡面xml的麻煩,輕鬆程式設計

1、背景 我們的專案的設計師喜歡用圓角矩形背景作為設計元素,而且顏色、樣式各不一樣導致專案工程裡面定義了大量的xml檔案,為了消除這一現象,我想到自定義控制元件解決這個問題。 圖1、專案中使用大量的xml定義圓角矩形 2、看看效果 先看效果         圖2自定義圓

android定義滑動開關控制元件,適合所有的android系統

我們都知道Android4.0以上才帶有滑動開關Switch,那麼在4.0以下呢,很多人會選擇用CheckBox,放兩張圖片,但是這樣子只能點選,效果不太好,所以我就自定義了滑動開關WiperSwitch這麼一個控制元件,下面先把截圖貼上吧,這蹩腳的圖片真戳啊,大家可以自己換

Android定義view組合控制元件解析

##使用場景 在開發中,或許一個業務需求中會出現很多系統控制元件組合成的佈局,並且經常需要複用。 比如下圖中 qq或者微博的title欄,在一款app中,可能不同的介面 類似的view要出現很多次,這個時候 就可以設計自己的view控制元件,就稱為組合控制元件

Android 定義彈幕控制元件

原理概述 繼承自FrameLayout新增控制元件,然後開啟動畫 如果要詳細一點大體流程就是: 初始化一個彈幕View 確認彈幕View位置 新增到父佈局 開啟動畫/定時任務 動畫結束/定時任務開始執行,移除彈幕View 滾動彈幕需要動畫效果,頂部和底部的彈

Android 定義檢視容器控制元件攔截ontouch事件傳遞給其子控制元件

自定義View 控制元件: /* * * 一個檢視容器控制元件 * 阻止 攔截 ontouch事件傳遞給其子控制元件 * */ public class InterceptScrollCon

Android拖動,縮放,定義內容,控制元件製作(可拖動縮放RelativeLayout定製)

先上效果圖: 一.     製作此控制元件的起源 專案需要一個可以拖動的控制元件,在網上可以找到很多例子,有圖片拖動控制元件,有textview拖動控制元件。但是專案中需要控制元件同時可以動態通過手指調整尺寸,並且控制元件的內容不固定,需要自定義內容,即可以新增任意內容

定義Switch開關控制元件

自定義Switch開關控制元件 *做安卓也有一年多了*,一直想去學習**自定義控制元件**這一塊(其實是自己懶–!),最近閒下來看了很多關於自定義控制元件方面的東西,雖然不是很熟練,但是基本上能去弄清楚它的實現方式有哪些。。也自己試著去模仿別人的程式碼做了一些自定義的控制元件,其中就有

【UE4】 第07講 實現定義的行走控制元件

      在圖形業,只有技術是不行的,你要明白我們從事的工作,我們可是在作詩,我們是詩人 - Nvidia創始人黃仁勳(圖形皇帝)       (版權宣告,禁止轉載)      U