package com.azhon.keyboard;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Rect;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 项目名: LicensePlateKeyboard
* 包名 com.azhon.keyboard
* 文件名: LicensePlateView
* 创建时间: 2019-08-30 on 22:51
* 描述: TODO 车牌号输入键盘
*
* @author 阿钟
*/
public class LicensePlateView extends LinearLayout implements View.OnClickListener {
/**
* 车牌简称
*/
private List<String> provinceList = new ArrayList<>();
/**
* 0~9,A~Z(车牌里没有I、O字母)
*/
private List<String> numList = new ArrayList<>();
/**
* 键盘的背景颜色
*/
private final int backgroundColor = Color.parseColor("#e9e9e9");
/**
* 键盘文字颜色
*/
private final int keyTextColor = Color.parseColor("#333333");
/**
* 键盘列数
*/
private final int spanCount = 10;
/**
* 键盘 键的间隔
*/
private final int keyButtonMargin = 15;
/**
* 键盘上下左右的边距
*/
private final int keyboardPadding = 10;
/**
* 按键点击回调
*/
private OnKeyClickListener onKeyClickListener;
private KeyAdapter keyAdapter;
public LicensePlateView(Context context) {
super(context);
init(context);
}
public LicensePlateView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context) {
setOrientation(LinearLayout.VERTICAL);
setBackgroundColor(backgroundColor);
initKeys();
RecyclerView recyclerView = new RecyclerView(context);
recyclerView.setOverScrollMode(OVER_SCROLL_NEVER);
recyclerView.setLayoutManager(new GridLayoutManager(context, spanCount));
recyclerView.addItemDecoration(new RecycleGridDivider(keyButtonMargin));
int padding = dip2px(context, keyboardPadding);
recyclerView.setPadding(padding, padding, padding, padding);
addView(recyclerView);
keyAdapter = new KeyAdapter(this);
recyclerView.setAdapter(keyAdapter);
keyAdapter.setNewData(provinceList);
}
/**
* 初始化按键
*/
private void initKeys() {
String[] province = getResources().getStringArray(R.array.province);
String[] num = getResources().getStringArray(R.array.nums);
Collections.addAll(provinceList, province);
Collections.addAll(numList, num);
}
/**
* 按键点击事件
*/
@Override
public void onClick(View v) {
TextView tvKey = v.findViewById(R.id.tv_key);
String key = tvKey.getText().toString();
if (key.equals("ABC\n123")) {
//键盘切换
keyAdapter.setNewData(numList);
return;
} else if (key.equals("省")) {
keyAdapter.setNewData(provinceList);
return;
}
if (onKeyClickListener != null) {
onKeyClickListener.onKeyClick(key);
}
}
private class KeyAdapter extends RecyclerView.Adapter<KeyAdapter.KeyViewHolder> {
private List<String> list = new ArrayList<>();
private OnClickListener listener;
public KeyAdapter(OnClickListener listener) {
this.listener = listener;
}
@NonNull
@Override
public KeyAdapter.KeyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_key, parent, false);
return new KeyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull KeyAdapter.KeyViewHolder holder, int position) {
String key = list.get(position);
holder.tvKey.setText(key);
holder.itemView.setOnClickListener(listener);
if (TextUtils.isEmpty(key)) {
holder.itemView.setBackgroundResource(0);
//键盘类型切换按键
} else if (key.equals("ABC\n123") || key.equals("省")) {
holder.tvKey.setTextSize(10);
holder.itemView.setBackgroundResource(R.drawable.sel_blue_radius_2);
holder.tvKey.setTextColor(Color.WHITE);
} else {
holder.tvKey.setTextSize(12);
holder.itemView.setBackgroundResource(R.drawable.sel_white_radius_2);
holder.tvKey.setTextColor(keyTextColor);
}
}
@Override
public int getItemCount() {
return list.size();
}
public void setNewData(List<String> list) {
this.list.clear();
this.list.addAll(list);
notifyDataSetChanged();
}
private class KeyViewHolder extends RecyclerView.ViewHolder {
private TextView tvKey;
public KeyViewHolder(@NonNull View itemView) {
super(itemView);
tvKey = itemView.findViewById(R.id.tv_key);
}
}
}
public class RecycleGridDivider extends RecyclerView.ItemDecoration {
/**
* 分割线宽度
*/
private int space;
public RecycleGridDivider(int space) {
this.space = space;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
GridLayoutManager manager = (GridLayoutManager) parent.getLayoutManager();
int span = manager.getSpanCount();
//为了Item大小均匀,将设定分割线平均分给左右两边Item各一半
int offset = space / 2;
//得到View的位置
int childPosition = parent.getChildAdapterPosition(view);
//第一排,顶部不画
if (childPosition < span) {
//最左边的,左边不画
if (childPosition % span == 0) {
outRect.set(0, 0, offset, 0);
//最右边,右边不画
} else if (childPosition % span == span - 1) {
outRect.set(offset, 0, 0, 0);
} else {
outRect.set(offset, 0, offset, 0);
}
} else {
//上下的分割线,就从第二排开始,每个区域的顶部直接添加设定大小,不用再均分了
if (childPosition % span == 0) {
outRect.set(0, space, offset, 0);
} else if (childPosition % span == span - 1) {
outRect.set(offset, space, 0, 0);
} else {
outRect.set(offset, space, offset, 0);
}
}
}
}
/**
* 设置按键点击事件
*/
public void setOnKeyClickListener(OnKeyClickListener listener) {
this.onKeyClickListener = listener;
}
public interface OnKeyClickListener {
void onKeyClick(String key);
}
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
LicensePlateKeyboard.zip (115个子文件)
gradlew.bat 2KB
executionHistory.bin 2.31MB
classAnalysis.bin 692KB
fileHashes.bin 130KB
outputFiles.bin 87KB
taskHistory.bin 28KB
resourceHashesCache.bin 18KB
last-build.bin 1B
.DS_Store 6KB
.gitignore 208B
.gitignore 7B
build.gradle 957B
build.gradle 565B
settings.gradle 55B
gradlew 5KB
app.iml 13KB
LicensePlateKeyboard.iml 874B
gradle-wrapper.jar 53KB
LicensePlateView.java 8KB
MainActivity.java 1KB
ExampleInstrumentedTest.java 752B
ExampleUnitTest.java 379B
buildOutputCleanup.lock 17B
fileHashes.lock 17B
fileContent.lock 17B
executionHistory.lock 17B
javaCompile.lock 17B
1.png 104KB
3.png 93KB
2.png 87KB
ic_launcher_round.png 15KB
ic_launcher_round.png 10KB
ic_launcher.png 9KB
ic_launcher_round.png 7KB
ic_launcher.png 6KB
ic_launcher_round.png 5KB
ic_launcher.png 4KB
ic_launcher.png 3KB
ic_launcher_round.png 3KB
ic_launcher.png 2KB
proguard-rules.pro 751B
gradle.properties 1KB
local.properties 426B
gradle-wrapper.properties 235B
cache.properties 54B
gc.properties 0B
gc.properties 0B
gradle_models.ser 141KB
build_file_checksums.ser 535B
workspace.xml 19KB
misc.xml 6KB
ic_launcher_background.xml 5KB
strings.xml 2KB
ic_launcher_foreground.xml 2KB
activity_main.xml 1KB
Gradle__androidx_test_espresso_espresso_idling_resource_3_1_1_aar.xml 963B
Gradle__androidx_swiperefreshlayout_swiperefreshlayout_1_0_0_aar.xml 906B
Gradle__androidx_coordinatorlayout_coordinatorlayout_1_0_0_aar.xml 898B
Gradle__androidx_test_espresso_espresso_core_3_1_1_aar.xml 886B
Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml 858B
Gradle__androidx_recyclerview_recyclerview_1_0_0_aar.xml 858B
Gradle__androidx_appcompat_appcompat_1_0_2_aar.xml 834B
Gradle__androidx_fragment_fragment_1_0_0_aar.xml 826B
Gradle__androidx_test_monitor_1_1_1_aar.xml 816B
Gradle__androidx_test_ext_junit_1_1_0_aar.xml 815B
Gradle__androidx_test_runner_1_1_1_aar.xml 809B
Gradle__androidx_print_print_1_0_0_aar.xml 802B
Gradle__androidx_test_core_1_1_0_aar.xml 796B
Gradle__androidx_core_core_1_0_1_aar.xml 794B
Gradle__org_hamcrest_hamcrest_integration_1_3_jar.xml 781B
Gradle__androidx_annotation_annotation_1_0_0_jar.xml 753B
Gradle__org_hamcrest_hamcrest_library_1_3_jar.xml 752B
Gradle__androidx_localbroadcastmanager_localbroadcastmanager_1_0_0_aar.xml 736B
Gradle__androidx_vectordrawable_vectordrawable_animated_1_0_0_aar.xml 733B
Gradle__org_hamcrest_hamcrest_core_1_3_jar.xml 732B
Gradle__androidx_legacy_legacy_support_core_utils_1_0_0_aar.xml 727B
Gradle__com_squareup_javawriter_2_1_1_jar.xml 725B
Gradle__androidx_versionedparcelable_versionedparcelable_1_0_0_aar.xml 723B
Gradle__androidx_lifecycle_lifecycle_livedata_core_2_0_0_aar.xml 723B
Gradle__androidx_asynclayoutinflater_asynclayoutinflater_1_0_0_aar.xml 723B
AndroidManifest.xml 712B
Gradle__androidx_legacy_legacy_support_core_ui_1_0_0_aar.xml 712B
Gradle__javax_inject_javax_inject_1_jar.xml 711B
Gradle__androidx_slidingpanelayout_slidingpanelayout_1_0_0_aar.xml 709B
Gradle__androidx_lifecycle_lifecycle_viewmodel_2_0_0_aar.xml 703B
Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml 698B
Gradle__androidx_lifecycle_lifecycle_runtime_2_0_0_aar.xml 693B
Gradle__androidx_vectordrawable_vectordrawable_1_0_1_aar.xml 688B
Gradle__net_sf_kxml_kxml2_2_3_0_jar.xml 686B
Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml 681B
Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml 674B
Gradle__androidx_documentfile_documentfile_1_0_0_aar.xml 674B
Gradle__androidx_arch_core_core_runtime_2_0_0_aar.xml 668B
Gradle__androidx_customview_customview_1_0_0_aar.xml 660B
Gradle__junit_junit_4_12_jar.xml 655B
Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml 653B
gradle.xml 634B
Gradle__androidx_loader_loader_1_0_0_aar.xml 632B
item_key.xml 614B
Gradle__androidx_lifecycle_lifecycle_common_2_0_0_jar.xml 584B
共 115 条
- 1
- 2
资源评论
- zcf2021-04-30直接是不能用的,尝试自己改一改,就当提供了一个思路
Code-Porter
- 粉丝: 1w+
- 资源: 39
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功