package com.open.androidtvwidget.keyboard;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.FontMetricsInt;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import com.open.androidtvwidget.keyboard.SoftKey.SaveSoftKey;
import com.open.androidtvwidget.utils.OPENLOG;
import java.util.List;
/**
* 软键盘绘制控件.(主软键盘,弹出键盘)
*
* @author hailong.qiu 356752238@qq.com
*/
public class SoftKeyboardView extends View {
private static final String TAG = "SoftKeyboardView";
public SoftKeyboardView(Context context) {
super(context);
init(context, null);
}
public SoftKeyboardView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public SoftKeyboardView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
mPaint = new Paint();
mPaint.setAntiAlias(true);
mFmi = mPaint.getFontMetricsInt();
}
private SoftKeyboard mSoftKeyboard;
private Bitmap mCacheBitmap;
/*
* 传入需要绘制的键盘(从XML读取出来的).
*/
public void setSoftKeyboard(SoftKeyboard softSkb) {
this.mSoftKeyboard = softSkb;
clearCacheBitmap();
}
public void clearCacheBitmap() {
mCacheBitmap = null;
invalidate();
}
@Override
protected void onDraw(Canvas rootCanvas) {
if (mSoftKeyboard == null)
return;
if (mCacheBitmap == null) {
OPENLOG.D("onDraw mCacheBitmap:" + mCacheBitmap);
mCacheBitmap = createCacheBitmap();
Canvas canvas = new Canvas(mCacheBitmap);
// 绘制键盘背景.
drawKeyboardBg(canvas);
// 绘制键盘的按键.
int rowNum = this.mSoftKeyboard.getRowNum();
for (int row = 0; row < rowNum; row++) {
KeyRow keyRow = this.mSoftKeyboard.getKeyRowForDisplay(row);
if (keyRow == null)
continue;
List<SoftKey> softKeys = keyRow.getSoftKeys();
int keyNum = softKeys.size();
for (int i = 0; i < keyNum; i++) {
SoftKey softKey = softKeys.get(i);
drawSoftKey(canvas, softKey, false);
}
}
}
// 绘制缓存.
drawCacheBitmap(rootCanvas);
// 绘制按键.
SoftKey key = mSoftKeyboard.getSelectSoftKey();
drawSoftKey(rootCanvas, key, true);
}
/**
* Bitmap.Config ARGB_8888:<br>
* 每个像素占四位,即A=8,R=8,G=8,B=8,<br>
* 那么一个像素点占8+8+8+8=32位<br>
*/
private Bitmap createCacheBitmap() {
return Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
}
private void drawCacheBitmap(Canvas rootCanvas) {
if (mCacheBitmap != null) {
Paint paint = new Paint();
paint.setAntiAlias(true);
rootCanvas.drawBitmap(mCacheBitmap, 0, 0, paint);
}
}
private Paint mPaint;
/**
* 绘制键盘的背景.
*/
private void drawKeyboardBg(Canvas canvas) {
Drawable bg = mSoftKeyboard.getKeyboardBg();
Rect rect = new Rect(0, 0, getWidth(), getHeight());
if (bg != null) {
bg.setBounds(rect);
bg.draw(canvas);
} else {
Paint paint = new Paint();
canvas.drawRect(rect, paint);
}
}
/**
* 绘制键值.
*/
private void drawSoftKey(Canvas canvas, SoftKey softKey, boolean isDrawState) {
if (softKey == null) {
OPENLOG.E("softKey is null...");
return;
}
// 绘制按键背景.
drawSoftKeyBg(canvas, softKey);
// 绘制选中状态.
if (isDrawState) {
if (softKey.isKeySelected()) {
drawSoftKeySelectState(canvas, softKey);
}
if (softKey.isKeyPressed()) {
drawSoftKeyPressState(canvas, softKey);
}
}
// 绘制选中状态 and 选中边框最前面.
// BUG(避免重复绘制) 主要用于挡住文字的,在绘制一次而已.
// 如果是透明的选中背景,那就不需要再重复绘制一次文字或者图标了.
if (isDrawState && mIsFront) {
return;
}
// 绘制按键内容.
String keyLabel = softKey.getKeyLabel();
Drawable keyIcon = softKey.getKeyIcon();
if (keyIcon != null) {
drawSoftKeyIcon(canvas, softKey, keyIcon);
} else if (!TextUtils.isEmpty(keyLabel)) {
drawSoftKeyText(canvas, softKey, keyLabel);
}
}
/**
* 绘制按键的图片.
*/
private void drawSoftKeyIcon(Canvas canvas, SoftKey softKey, Drawable keyIcon) {
int marginLeft = Math.abs((int) ((softKey.getWidth() - keyIcon.getIntrinsicWidth()) / 2)) + 2;
int marginRight = Math.abs((int) (softKey.getWidth() - keyIcon.getIntrinsicWidth() - marginLeft)) + 4;
int marginTop = Math.abs((int) ((softKey.getHeight() - keyIcon.getIntrinsicHeight()) / 2)) + 2;
int marginBottom = Math.abs((int) (softKey.getHeight() - keyIcon.getIntrinsicHeight() - marginTop)) + 4;
keyIcon.setBounds(softKey.getLeft() + marginLeft, softKey.getTop() + marginTop,
softKey.getRight() - marginRight, softKey.getBottom() - marginBottom);
keyIcon.draw(canvas);
}
private FontMetricsInt mFmi;
/**
* 绘制按键的文本字符.
*/
private void drawSoftKeyText(Canvas canvas, SoftKey softKey, String keyLabel) {
mPaint.setTextSize(softKey.getTextSize()); // 文本大小.
mPaint.setColor(softKey.getTextColor()); // 文本颜色.
mFmi = mPaint.getFontMetricsInt();
int fontHeight = mFmi.bottom - mFmi.top; // 字體的高度.
float fontWidth = mPaint.measureText(keyLabel);
float marginX = (softKey.getWidth() - fontWidth) / 2.0f;
float marginY = (softKey.getHeight() - fontHeight) / 2.0f;
float x = softKey.getLeftF() + marginX;
// float y = softKey.getTopF() - (mFmi.top) + marginY;
/**
* +1,绘制文字的地方才不会出现问题。
*/
float y = softKey.getTopF() - (mFmi.top + 1) + marginY;
canvas.drawText(keyLabel, x, y, mPaint);
}
/**
* 绘制按键背景.
*/
private void drawSoftKeyBg(Canvas canvas, SoftKey softKey) {
Drawable bgDrawable = softKey.getKeyBgDrawable();
if (bgDrawable != null) {
Rect rect = softKey.getRect();
bgDrawable.setBounds(rect);
bgDrawable.draw(canvas);
}
}
/**
* 绘制按键的选中状态.
*/
private void drawSoftKeySelectState(Canvas canvas, SoftKey softKey) {
Drawable selectDrawable = softKey.getKeySelectDrawable();
if (selectDrawable != null) {
Rect rect = softKey.getMoveRect();//mIsMoveRect ? softKey.getMoveRect() : softKey.getRect();
int leftPadding, rightPadding, topPadding, bottomPadding;
leftPadding = rightPadding = topPadding = bottomPadding = 0;
if (this.mSelectBgRect != null) {
leftPadding = (int) Math.rint(mSelectBgRect.left);
rightPadding = (
没有合适的资源?快使用搜索试试~ 我知道了~
机顶盒launcher
共194个文件
java:82个
xml:42个
png:31个
3星 · 超过75%的资源 需积分: 33 30 下载量 190 浏览量
2017-04-05
21:22:04
上传
评论 1
收藏 931KB RAR 举报
温馨提示
tab+viewpager类型的launcher
资源推荐
资源详情
资源评论
收起资源包目录
机顶盒launcher (194个子文件)
gradlew.bat 2KB
config 270B
description 73B
exclude 240B
.gitignore 118B
.gitignore 7B
.gitignore 7B
build.gradle 1KB
build.gradle 684B
build.gradle 564B
settings.gradle 35B
gradlew 5KB
HEAD 185B
HEAD 185B
HEAD 32B
HEAD 23B
pack-103f211de5d8c4b3dc258a3c349485c048b3e9e8.idx 9KB
AVLUNCHER.iml 709B
index 21KB
gradle-wrapper.jar 52KB
SoftKeyboardView.java 24KB
RecyclerViewTV.java 20KB
XmlKeyboardLoader.java 14KB
ReflectItemView.java 10KB
MainUpView.java 10KB
BaseEffectBridgeWrapper.java 10KB
LabelView.java 9KB
SkbContainer.java 8KB
OpenEffectBridge.java 8KB
ShellUtils.java 8KB
MainActivity.java 7KB
SoftKey.java 7KB
SoftKeyboard.java 7KB
IdentifierUtuils.java 6KB
BestFragment.java 6KB
TvFragment.java 6KB
CustomApplicationHelper.java 5KB
EffectNoDrawBridge.java 5KB
SPUtils.java 5KB
AutoMeaureGridLayoutManager.java 4KB
LinearLayoutManagerTV.java 4KB
ListRowPresenter.java 4KB
OpenMenuItemView.java 4KB
OpenMenuImpl.java 4KB
RecyclerViewBridge.java 4KB
OpenTabHost.java 4KB
SmoothHorizontalScrollView.java 3KB
OpenMenuItemImpl.java 3KB
GeneralAdapter.java 3KB
OPENLOG.java 3KB
DefualtListPresenter.java 3KB
ItemListPresenter.java 2KB
SmoothVorizontalScrollView.java 2KB
TabAdapter.java 2KB
TextViewWithTTF.java 2KB
SoftKeyBoardable.java 2KB
SaveKeyEvent.java 2KB
ItemContainerView.java 2KB
ListContentView.java 2KB
BaseEffectBridge.java 2KB
OpenMenuItem.java 2KB
MenuDataObservable.java 1KB
BaseFragment.java 1KB
AvApp.java 1KB
ListViewTV.java 1KB
BitmapMemoryCache.java 1KB
GridViewTV.java 1KB
WidgetTvViewBring.java 1KB
ItemHeaderPresenter.java 1KB
OpenMenu.java 1KB
FrameMainLayout.java 1KB
ListRow.java 1KB
OpenPresenter.java 1KB
GenerateViewId.java 1KB
GridLayoutManagerTV.java 1KB
ItemKeyHelper.java 1KB
RelativeMainLayout.java 1KB
NetWorkUtils.java 1KB
LinearMainLayout.java 1KB
VarityFragment.java 900B
BaseActivity.java 869B
MovieFragment.java 807B
ExampleInstrumentedTest.java 748B
NORLinearLayout.java 724B
ExpendGridView.java 704B
SkbPool.java 654B
BaseTabTitleAdapter.java 557B
AnimateUtils.java 555B
KeyRow.java 409B
ExampleUnitTest.java 400B
PrvInterface.java 387B
MenuSetObserver.java 361B
GuidActivity.java 360B
ApplicationTest.java 355B
ViewPagerTV.java 348B
Utils.java 338B
DrawUtils.java 338B
ExampleUnitTest.java 317B
AVLog.java 285B
DisplayUtil.java 283B
共 194 条
- 1
- 2
资源评论
- xnrmfpsohk2018-06-15很好的资料,很齐全,谢谢.
- 财源广进2892021-04-02不行 不是想要的
qq_33417456
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功