Android动态生成视图渲染到墨水屏

193 阅读2分钟

需求背景

基于一个客户的需求,想要定制一个app软件功能,基于墨水屏+驱动板,采用app把动态生成的图片通过蓝牙更新到一个墨水屏上。这样用户就可以动态更新自己的自定义标签到墨水屏上。

25e16dad183c7df637fbf5852e587ac.jpg

开始思考

于是,我就开始了采用 通义灵码来进行编程。

1732842383040.png

import com.tencent.mmkv.MMKV;

public class MmkvUtils {

private static final String MMKV_ID = "mmkv_id";

private static MMKV mmkv;

static {
    mmkv = MMKV.mmkvWithID(MMKV_ID);
}

// 存储字符串
public static void putString(String key, String value) {
    mmkv.encode(key, value);
}

// 获取字符串
public static String getString(String key, String defaultValue) {
    return mmkv.decodeString(key, defaultValue);
}

// 存储整数
public static void putInt(String key, int value) {
    mmkv.encode(key, value);
}

// 获取整数
public static int getInt(String key, int defaultValue) {
    return mmkv.decodeInt(key, defaultValue);
}

// 存储布尔值
public static void putBoolean(String key, boolean value) {
    mmkv.encode(key, value);
}

// 获取布尔值
public static boolean getBoolean(String key, boolean defaultValue) {
    return mmkv.decodeBool(key, defaultValue);
}

// 存储浮点数
public static void putFloat(String key, float value) {
    mmkv.encode(key, value);
}

// 获取浮点数
public static float getFloat(String key, float defaultValue) {
    return mmkv.decodeFloat(key, defaultValue);
}

// 存储长整数
public static void putLong(String key, long value) {
    mmkv.encode(key, value);
}

// 获取长整数
public static long getLong(String key, long defaultValue) {
    return mmkv.decodeLong(key, defaultValue);
}

// 删除指定键的值
public static void removeKey(String key) {
    mmkv.removeValueForKey(key);
}

// 清空所有数据
public static void clearAll() {
    mmkv.clearAll();
}

}

是不是很神奇,我们自己写的话需要花半天。它几秒就生成了。 下面根据我的需求,自己生成的一个选择列表。

public class SelectOriginActivity extends AppCompatActivity { private String[] origins; // 原始数据 private ListView listView; private EditText etBrand; private int selectedOriginIndex = 0; private ArrayAdapter adapter;

private static final String KEY_KIND = "key_kind";
private static final String KEY_SELECTED_ORIGIN = "key_selected_origin";

private void getDataBySource(int selectedOriginIndex) {
    switch (selectedOriginIndex) {
        case 1:
            origins = getResources().getStringArray(R.array.cigarette_brands);
            break;
        default:
            break;
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    selectedOriginIndex = getIntent().getIntExtra(KEY_KIND, 0);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_select_origin);

    getDataBySource(selectedOriginIndex);

    listView = findViewById(R.id.list_view);
    etBrand = findViewById(R.id.et_brand);

    // 设置适配器
    adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, origins);
    listView.setAdapter(adapter);

    // 设置列表项点击事件
    listView.setOnItemClickListener((parent, view, position, id) -> {
        String selectedOrigin = origins[position];
        // 创建 Intent 并返回结果
        Intent resultIntent = new Intent();
        resultIntent.putExtra(KEY_SELECTED_ORIGIN, selectedOrigin);
        setResult(RESULT_OK, resultIntent);
        finish();
    });

    // 添加文本变化监听器
    etBrand.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // 根据输入内容过滤列表
            filterList(s.toString());
        }

        @Override
        public void afterTextChanged(Editable s) {}
    });
}

private void filterList(String text) {
    ArrayList<String> filteredList = new ArrayList<>();
    for (String item : origins) {
        if (item.toLowerCase().contains(text.toLowerCase())) {
            filteredList.add(item);
        }
    }
    adapter.clear();
    adapter.addAll(filteredList);
    adapter.notifyDataSetChanged();
}

}

1732843007196.png

界面预览

我需要编译一个预览界面来显示动态生成的图片。

81dd417475a7d627b93b80581f4c305.jpg 03b9f1ee0abb11690925ebd29de9a7d.jpg

图片算法选择

ced8b06a1e13a040c84c61259342c55.jpg

上传图像,更新屏幕

app通过连接驱动板的蓝牙之后,通过蓝牙进行数据传输,把app里面的bitmap同时字节数组的形式,传输给单片机,单片机再把数据传递到墨水瓶。这样我们就可以把自己的通过代码生成的自定义烟价标签图片动态更新到墨水屏上。

总结

通过通义灵码的辅助,我们可以生成一些我们需要的代码,并且进行代码的优化。通过软件+硬件+Ai辅助,满足我们自己的需求。并且通过这个挣了一点小money.