展会信息港展会大全

Android日历功能有GestureDetector手势识别功能
来源:互联网   发布日期:2016-01-14 12:31:45   浏览:1608次  

导读:这几天学习网上的一个记事本的一个程序,代码写的不错,在Android上如何显示日历呢还能进行手势的识别的功能?首先将效果图贴上:因为加了GestureDetector的功能当点击的时候会跳转到相应的Activity,鼠标左右滑......

这几天学习网上的一个记事本的一个程序,代码写的不错,在Android上如何显示日历呢还能进行手势的识别的功能?首先将效果图贴上:

因为加了GestureDetector的功能当点击的时候会跳转到相应的Activity,鼠标左右滑动可首先类似翻页的效果。

下面是CalenderActivity类,他的view是我们自己实现的CalendarView。

CalendarView calendarView=newCalendarView(this);

setContentView(calendarView);

public class CalendarActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

CalendarView calendarView = new CalendarView(this);

setContentView(calendarView);

}

public void showDiaryList(int year, int month, int day) {

Intent intent = new Intent(this, DiaryList.class);

intent.putExtra("cal", new GregorianCalendar(year, month, day));

startActivity(intent);

}

}

下面是CalenderView类,在这里面绘制了整个日历的界面:

public class CalendarView extends View {

static public class DateRect {

private int x;

private int y;

private int day;

public static int rectSize = 20;

public static int diff = 10;

public DateRect(int x, int y, int day) {

super();

this.x = x;

this.y = y;

this.day = day;

}

public int getX() {

return x;

}

public void setX(int x) {

this.x = x;

}

public int getY() {

return y;

}

public void setY(int y) {

this.y = y;

}

public int getDay() {

return day;

}

public void setDay(int day) {

this.day = day;

}

public boolean isSelected(float selX, float selY) {

if ((selX >= x - diff && selX <= x + rectSize + diff)

&& (selY >= y - rectSize - diff && selY <= y + diff)) {

return true;

}

return false;

}

}

public static final int INVALID_POSITION = -1;

private int leftPadding = 20;

private int topPadding = 100;

private int rowPadding;

private int colPadding;

private int year;

private int month;

private int day;

private Calendar cal = Calendar.getInstance();

private Calendar today = (Calendar) cal.clone();

private List<DateRect> rects;

private final Paint cPaint;

private final Paint tPaint;

private CalendarActivity calendar;

private GestureDetector mGestureDetector;

public CalendarView(Context context) {

super(context);

calendar = (CalendarActivity) context;

setFocusable(true);

setFocusableInTouchMode(true);

cPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

cPaint.setStyle(Paint.Style.FILL_AND_STROKE);

cPaint.setColor(Color.RED);

cPaint.setTextSize(20f);

tPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

tPaint.setStyle(Paint.Style.FILL_AND_STROKE);

tPaint.setColor(Color.BLACK);

tPaint.setTextSize(20f);

setBackgroundColor(Color.GREEN);

mGestureDetector = new GestureDetector(

new GestureDetector.SimpleOnGestureListener() {

@Override

public boolean onFling(MotionEvent e1, MotionEvent e2,

float velocityX, float velocityY) {

if (e1.getX() > e2.getX()) {

cal.add(Calendar.MONTH, 1);

CalendarView.this.invalidate();

}

if (e1.getX() < e2.getX()) {

cal.add(Calendar.MONTH, -1);

CalendarView.this.invalidate();

}

return true;

}

@Override

public boolean onSingleTapUp(MotionEvent e) {

day = getDay(e.getX(), e.getY());

if (day != INVALID_POSITION) {

calendar.showDiaryList(year, month, day);

}

return true;

}

});

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

colPadding = (w - leftPadding) / 7;

rowPadding = (h - topPadding) / 7;

}

@Override

protected void onDraw(Canvas canvas) {

// Drawing commands go here

year = cal.get(Calendar.YEAR);

month = cal.get(Calendar.MONTH);

String yearMonth = year + "年" + (month + 1) + "月";

canvas.drawText(yearMonth, (colPadding * 7) / 2 - 35, 50, tPaint);

String[] weekStr = new String[] { "一", "二", "三", "四", "五", "六", "日" };

for (int i = 0; i < weekStr.length; i++) {

canvas.drawText(weekStr[i], leftPadding + i * colPadding,

topPadding, tPaint);

}

cal.set(Calendar.DATE, 1);

int month = cal.get(Calendar.MONTH);

int y = 1;

rects = new ArrayList<DateRect>();

while (cal.get(Calendar.MONTH) == month) {

int day = cal.get(Calendar.DATE);

int x = cal.get(Calendar.DAY_OF_WEEK);

if (x == 1) {

x = 7;

} else {

x = x - 1;

}

int dx = leftPadding + (x - 1) * colPadding;

int dy = topPadding + y * rowPadding;

rects.add(new DateRect(dx, dy, day));

if (cal.equals(today)) {

canvas.drawText(day + "", dx, dy, cPaint);

} else {

canvas.drawText(day + "", dx, dy, tPaint);

}

if (x == 7) {

y = y + 1;

}

cal.add(Calendar.DATE, 1);

}

cal.add(Calendar.DATE, -1);

}

@Override

public boolean onTouchEvent(MotionEvent event) {

mGestureDetector.onTouchEvent(event);

return true;

}

private int getDay(float x, float y) {

for (DateRect rect : rects) {

if (rect.isSelected(x, y)) {

return rect.getDay();

}

}

return INVALID_POSITION;

}

}

这样就实现了简单功能的Android日历。

赞助本站

人工智能实验室

相关热词: 日历 GestureDetector 手势

AiLab云推荐
推荐内容
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港