package com.majunzhe.demos.te_customeview;
/**
* Created by mjz on 15-1-8.
*/
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import java.util.Random;
/**
* This view implements the drawing canvas.
*
* It handles all of the input events and drawing functions.
*/
public class PaintView extends View {
private static final int MSG_FADE = 1;
/** Menu ID for the command to clear the window. */
private static final int CLEAR_ID = Menu.FIRST;
/** Menu ID for the command to toggle fading. */
private static final int FADE_ID = Menu.FIRST+1;
/** How often to fade the contents of the window (in ms). */
private static final int FADE_DELAY = 100;
/** Colors to cycle through. */
static final int[] COLORS = new int[] {
Color.WHITE, Color.RED, Color.YELLOW, Color.GREEN,
Color.CYAN, Color.BLUE, Color.MAGENTA,
};
/** Background color. */
static final int BACKGROUND_COLOR = Color.BLACK;
private static final int FADE_ALPHA = 0x06;
private static final int MAX_FADE_STEPS = 256 / (FADE_ALPHA/2) + 4;
private static final int TRACKBALL_SCALE = 10;
private static final int SPLAT_VECTORS = 40;
private final Random mRandom = new Random();
private Bitmap mBitmap;
private Canvas mCanvas;
private final Paint mPaint = new Paint();
private final Paint mFadePaint = new Paint();
private float mCurX;
private float mCurY;
private int mOldButtonState;
private int mFadeSteps = MAX_FADE_STEPS;
/** The index of the current color to use. */
int mColorIndex;
public PaintView(Context c) {
super(c);
init();
}
public PaintView(Context c, AttributeSet attrs) {
super(c, attrs);
init();
}
private void init() {
setFocusable(true);
mPaint.setAntiAlias(true);
mFadePaint.setColor(BACKGROUND_COLOR);
mFadePaint.setAlpha(FADE_ALPHA);
}
public void clear() {
if (mCanvas != null) {
mPaint.setColor(BACKGROUND_COLOR);
mCanvas.drawPaint(mPaint);
invalidate();
mFadeSteps = MAX_FADE_STEPS;
}
}
public void fade() {
if (mCanvas != null && mFadeSteps < MAX_FADE_STEPS) {
mCanvas.drawPaint(mFadePaint);
invalidate();
mFadeSteps++;
}
}
public void text(String text) {
if (mBitmap != null) {
final int width = mBitmap.getWidth();
final int height = mBitmap.getHeight();
mPaint.setColor(COLORS[mColorIndex]);
mPaint.setAlpha(255);
int size = height;
mPaint.setTextSize(size);
Rect bounds = new Rect();
mPaint.getTextBounds(text, 0, text.length(), bounds);
int twidth = bounds.width();
twidth += (twidth/4);
if (twidth > width) {
size = (size*width)/twidth;
mPaint.setTextSize(size);
mPaint.getTextBounds(text, 0, text.length(), bounds);
}
Paint.FontMetrics fm = mPaint.getFontMetrics();
mCanvas.drawText(text, (width-bounds.width())/2,
((height-size)/2) - fm.ascent, mPaint);
mFadeSteps = 0;
invalidate();
}
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
int curW = mBitmap != null ? mBitmap.getWidth() : 0;
int curH = mBitmap != null ? mBitmap.getHeight() : 0;
if (curW >= w && curH >= h) {
return;
}
if (curW < w) curW = w;
if (curH < h) curH = h;
Bitmap newBitmap = Bitmap.createBitmap(curW, curH, Bitmap.Config.ARGB_8888);
Canvas newCanvas = new Canvas();
newCanvas.setBitmap(newBitmap);
if (mBitmap != null) {
newCanvas.drawBitmap(mBitmap, 0, 0, null);
}
mBitmap = newBitmap;
mCanvas = newCanvas;
mFadeSteps = MAX_FADE_STEPS;
}
@Override
protected void onDraw(Canvas canvas) {
if (mBitmap != null) {
canvas.drawBitmap(mBitmap, 0, 0, null);
}
}
@Override
public boolean onTrackballEvent(MotionEvent event) {
final int action = event.getActionMasked();
if (action == MotionEvent.ACTION_DOWN) {
// Advance color when the trackball button is pressed.
advanceColor();
}
if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_MOVE) {
final int N = event.getHistorySize();
final float scaleX = event.getXPrecision() * TRACKBALL_SCALE;
final float scaleY = event.getYPrecision() * TRACKBALL_SCALE;
for (int i = 0; i < N; i++) {
moveTrackball(event.getHistoricalX(i) * scaleX,
event.getHistoricalY(i) * scaleY);
}
moveTrackball(event.getX() * scaleX, event.getY() * scaleY);
}
return true;
}
private void moveTrackball(float deltaX, float deltaY) {
final int curW = mBitmap != null ? mBitmap.getWidth() : 0;
final int curH = mBitmap != null ? mBitmap.getHeight() : 0;
mCurX = Math.max(Math.min(mCurX + deltaX, curW - 1), 0);
mCurY = Math.max(Math.min(mCurY + deltaY, curH - 1), 0);
paint(PaintMode.Draw, mCurX, mCurY);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return onTouchOrHoverEvent(event, true /*isTouch*/);
}
@Override
public boolean onHoverEvent(MotionEvent event) {
return onTouchOrHoverEvent(event, false /*isTouch*/);
}
private boolean onTouchOrHoverEvent(MotionEvent event, boolean isTouch) {
final int buttonState = event.getButtonState();
int pressedButtons = buttonState & ~mOldButtonState;
mOldButtonState = buttonState;
if ((pressedButtons & MotionEvent.BUTTON_SECONDARY) != 0) {
// Advance color when the right mouse button or first stylus button
// is pressed.
advanceColor();
}
PaintMode mode;
if ((buttonState & MotionEvent.BUTTON_TERTIARY) != 0) {
// Splat paint when the middle mouse button or second stylus button is pressed.
mode = PaintMode.Splat;
} else if (isTouch || (buttonState & MotionEvent.BUTTON_PRIMARY) != 0) {
// Draw paint when touching or if the primary button is pressed.
mode = PaintMode.Draw;
} else {
// Otherwise, do not paint anything.
return false;
}
final int action = event.getActionMasked();
if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_MOVE
|| action == MotionEvent.ACTION_HOVER_MOVE) {
final int N = event.getHistorySize();
final int P = event.getPointerCount();
for (int i = 0; i < N; i++) {
for (int j = 0; j < P; j++) {
paint(getPaintModeForTool(event.getToolType(j), mode),
event.getHistoricalX(j, i),
event.getHistoricalY(j, i),
event.getHistoricalPressure(j, i),
event.getHistoricalTouchMajor(j, i),
event.getHistoricalTouchMinor(j, i),
event.getHistoricalOrientation(j, i),
event.getHistoricalAxisValue(MotionEvent.AXIS_DISTANCE, j, i),
event.getHistoricalAxisValue(MotionEvent.AXIS_TILT, j, i));
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
Android建立demo时一种实用的管理方法
共61个文件
xml:22个
java:18个
png:17个
5星 · 超过95%的资源 需积分: 9 13 下载量 9 浏览量
2015-01-11
01:18:12
上传
评论
收藏 2.78MB ZIP 举报
温馨提示
在学习安卓时,可能会建立大量的test project 来测试各个组件,以更好的学习它。 但是为了验证学习每一种效果,会非常没必要,而且特别繁琐。 现在介绍的是两种管理方法: 1 较为简单,但是需要比第二个步骤多出个步骤 2 逻辑较第一个复杂一点,但是胜在方便,且能分类。
资源推荐
资源详情
资源评论
收起资源包目录
main.zip (61个子文件)
main
.zip 1.39MB
tab-web.png 31KB
res
animator
anim.xml 367B
menu
menu_te.xml 376B
main.xml 578B
global.xml 304B
menu_home.xml 409B
values-appliance
drawable-hdpi
m.jpg 549KB
ic_launcher.png 9KB
tab.png 3KB
ic_drawer.png 3KB
drawer_shadow.9.png 117B
drawable-xhdpi
ic_launcher.png 14KB
tab.png 4KB
ic_drawer.png 3KB
drawer_shadow.9.png 174B
drawable
m.jpg 549KB
frantic.jpg 188KB
drawable-xxhdpi
ic_launcher.png 19KB
tab.png 7KB
ic_drawer.png 202B
drawer_shadow.9.png 208B
values
strings.xml 698B
styles.xml 417B
dimens.xml 440B
drawable-mdpi
ic_launcher.png 5KB
tab.png 2KB
ic_drawer.png 3KB
drawer_shadow.9.png 142B
layout
fragment_main.xml 1KB
activity_main2.xml 743B
activity_arcs.xml 661B
activity_anim.xml 748B
activity_main.xml 2KB
tab_item.xml 815B
entry_list_item.xml 365B
activity_home.xml 514B
activity_tab.xml 1KB
activity_te.xml 780B
fragment_navigation_drawer.xml 416B
activity_game1.xml 1KB
values-w820dp
dimens.xml 358B
java
com
majunzhe
demos
te_and2
MyFragmentAdapter.java 814B
DemoFragment.java 1KB
MainActivity.java 4KB
TeDemos.java 4KB
main
HomeActivity.java 3KB
IntentAction.java 181B
ActivityManager.java 2KB
te_customeview
Arcs.java 2KB
Game.java 6KB
ArcsSampleView.java 3KB
PaintView.java 13KB
Sweep.java 349B
SweepSampleView.java 2KB
te_tabs
MyTabActivity.java 2KB
TeActivity.java 2KB
te_and1
MainActivity.java 5KB
NavigationDrawerFragment.java 11KB
te_anim
AnimMainActivity.java 3KB
AndroidManifest.xml 4KB
共 61 条
- 1
资源评论
- 超跑小鱼2015-01-11挺不错的,推荐下载
jiangxiaoma111
- 粉丝: 8
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于Python+Flask的智能图书借阅系统-毕业设计源码+使用文档(高分优秀项目).zip
- 基于Python+Flask的智能图书借阅系统-毕业设计源码+使用文档(高分优秀项目).zip
- 回文素数c语言.doc
- 一个简单的关于520的小程序示例
- 基于RISC-V的处理器设计与实现
- html知识全网最全最完整css样式
- 基于java实现的智慧医院门诊管理系统项目源码+设计文档+实验报告+详细资料+数据库sql文件.zip
- 同方生产资料目录清单 (2024.4.28)-服务器资料模板.zip
- 上市公司银企关联/银企关系/银行关系(代码+数据)2008-2023年
- 基于区块链的数字版权管理的设计与实现+详细文档+全部资料(高分毕业设计).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功