TINT简单使用(转来记录)

本文介绍了如何在Android中使用XML的tint属性和DrawableCompat工具类来实现图片的着色和动态颜色渲染。通过设置tint,可以静态地改变ImageView中图片的颜色,而DrawableCompat则允许在运行时动态调整图片颜色,增强UI的可定制性。

1.在xml中设置tint和tintMode实现对图片的着色,它通过修改图形的Alpha遮罩来修改图像的颜色,从而达到重新着色的目的

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:src="@mipmap/icon_head" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:src="@mipmap/icon_head"
        //此处为设置新颜色
        android:tint="#FF4081" />
</LinearLayout>

2.利用DrawableCompat对图片进行动态颜色渲染

package com.per.tintdome;

import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.widget.ImageView;

public class MainActivity extends Activity {
    private ImageView imageView1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView1 = (ImageView) findViewById(R.id.image1);
        //利用ContextCompat工具类获取drawable图片资源
        Drawable drawable = ContextCompat.getDrawable(this, R.mipmap.icon_head);
        //简单的使用tint改变drawable颜色
        Drawable drawable1 = tintDrawable(drawable,ContextCompat.getColor(this, R.color.colorAccent));
        imageView1.setImageDrawable(drawable1);
    }

    public static Drawable tintDrawable(Drawable drawable, int colors) {
        final Drawable wrappedDrawable = DrawableCompat.wrap(drawable).mutate();
        DrawableCompat.setTint(wrappedDrawable, colors);
        return wrappedDrawable;
    }
}

 

题目重述 ① 使用TMS320F28335实现一盏LED灯以1Hz频率闪烁; ② 按下按键后,LED灯在频闪和常亮两种模式之间切换。 --- 详解 要实现LED以1Hz频闪,需利用定时器(如CPU Timer0)产生周期为1秒的中断。每次中断翻转LED状态(亮/灭),实现闪烁。 通过GPIO配置按键输入,检测低电平(或上升沿)触发模式切换。使用标志位记录当前模式(频闪或常亮)。在主循环或中断服务程序中根据模式控制LED输出: - 频闪模式:由定时器每1秒翻转一次LED状态; - 常亮模式:将LED对应GPIO设为高电平(或低电平,视硬件连接而定)。 关键配置包括: - 初始化系统时钟(通常为150MHz); - 设置CPU Timer0周期为1s(例如:$ \text{Period} = 150 \times 10^6 / \text{prescaler} \times 1 $); - 配置LED引脚(如GPIO13)为输出; - 配置按键引脚(如GPIO17)为输入,启用内部上拉电阻; - 在中断服务程序中处理LED翻转,在主循环中检测按键状态并切换模式。 --- 代码概述 以下是一个基于TI官方库函数(DSP2833x头文件)编写的完整C语言示例程序,用于TMS320F28335实现LED 1Hz频闪与按键切换常亮功能。 --- 代码解析 ```c #include "DSP2833x_Device.h" // F28335寄存器定义 #include "DSP2833x_Examples.h" #define LED_TOGGLE 1 #define LED_ON 0 // 全局变量 volatile Uint16 ledMode = LED_TOGGLE; // 初始为频闪模式 volatile Uint16 toggleFlag = 1; // 函数声明 void InitLED(void); void InitSW(void); __interrupt void cpu_timer0_isr(void); void main(void) { InitSysCtrl(); // 初始化系统时钟(150MHz) DINT; // 关闭全局中断 InitPieCtrl(); // 初始化PIE控制器 IER = 0x0000; IFR = 0x0000; InitPieVectTable(); // 将CPU Timer0中断映射到PIE PieVectTable.TINT0 = &cpu_timer0_isr; PieCtrlRegs.PIEIER1.bit.INTx7 = 1; // 使能Timer0中断 IER |= M_INT1; InitLED(); InitSW(); // 初始化CPU Timer0(1秒周期) CpuTimer0.RegsAddr = &CpuTimer0Regs; CpuTimer0Regs.PRD.all = 0xFFFFFFFF; // 临时值 CpuTimer0Regs.TPR.all = 0; CpuTimer0Regs.TPRH.all = 0; CpuTimer0Regs.TCR.bit.TSS = 1; // 停止定时器 CpuTimer0Regs.TCR.bit.TRB = 1; // 重新加载周期值 CpuTimer0Regs.TCR.bit.SOFT = 1; CpuTimer0Regs.TCR.bit.FREE = 1; ConfigCpuTimer(&CpuTimer0, 150, 1.0); // 150MHz, 1秒周期 CpuTimer0Regs.TCR.bit.TSS = 0; // 启动定时器 EINT; // 使能全局中断 ERTM; // 使能实时中断 for(;;) { // 主循环中检测按键状态 if(GpioDataRegs.GPBDAT.bit.GPIO17 == 0) { // 按键按下(低电平) DELAY_US(10000); // 简单消抖 if(GpioDataRegs.GPBDAT.bit.GPIO17 == 0) { ledMode = !ledMode; // 切换模式 while(GpioDataRegs.GPBDAT.bit.GPIO17 == 0); // 等待释放 } } // 常亮模式处理 if(ledMode == LED_ON) { GpioDataRegs.GPBSET.bit.GPIO13 = 1; // LED亮 } else { // 频闪由中断控制 } } } // 定时器0中断服务函数 __interrupt void cpu_timer0_isr(void) { if(ledMode == LED_TOGGLE) { GpioDataRegs.GPBTOGGLE.bit.GPIO13 = 1; // 翻转LED } PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 清除中断 } // 初始化LED(假设接在GPIO13) void InitLED(void) { EALLOW; GpioCtrlRegs.GPBMUX1.bit.GPIO13 = 0; // 设为通用IO GpioCtrlRegs.GPBDIR.bit.GPIO13 = 1; // 输出模式 GpioDataRegs.GPBSET.bit.GPIO13 = 1; // 初始熄灭(共阳极) EDIS; } // 初始化按键(假设接在GPIO17) void InitSW(void) { EALLOW; GpioCtrlRegs.GPBMUX1.bit.GPIO17 = 0; // 通用IO GpioCtrlRegs.GPBDIR.bit.GPIO17 = 0; // 输入 GpioCtrlRegs.GPBPUD.bit.GPIO17 = 0; // 使能上拉 EDIS; } ``` --- 知识点 1. **GPIO配置与控制**:通过设置方向寄存器(GPxDIR)和数据寄存器(GPxSET/GPxCLR)实现输入输出控制。 2. **CPU定时器中断**:利用F28335内置定时器产生精确时间基准,通过中断服务程序执行周期性任务。 3. **中断向量映射与使能**:需正确配置PIE中断向量表及IER寄存器,确保中断能被CPU响应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值