我想使日历视图,以支持触摸交互。 所以我想建立新的自定义日历视图。 我试图使之间的观点偏移和实际日期值映射功能。
I want to make calendar view in order to support touch interaction. So I'd like to build new custom calendar view. I tried to make mapping function between view offset and real date value.
下面是我的想法: 如果我能计算出周自基准日数(在我的情况,1989年12月31日), 很容易知道的偏移。 HEIGHT_FOR_WEEK * NUM_OF_WEEK是很简单的计算 要知道确切的偏移量。
Here is my idea: If I can compute the number of weeks since base date(in my case, 1989-12-31), it is easy to know offset. HEIGHT_FOR_WEEK * NUM_OF_WEEK is very simple computation to know exact offset.
我的问题是这样的: 首先我从基准日毫秒值。我设置毫秒 另一个日历对象。我希望从该对象相同的日期。但实际上, 这是不同的日期。
My problem is this: First I got milliseconds value from base date. And I set the milliseconds to another calendar object. I expected same date from that object. But actually it was different date.
mBaseDateInMillis = mBaseDate.getTimeInMillis();
mAnotherDate.setTimeInMillis(mBaseDateInMillis);
/* I expect mBaseDate == mAnotherDate.
* but it was different.
*/
下面是我的code:
public class CalendarCoordinate {
public static final long ONEWEEK_IN_MILLISECONDS = 60 * 60 * 24 * 7 * 1000;
public Calendar mBaseDate = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
public long mBaseDateInMillis = 0;
public Calendar mDate = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
public int mWeekHeight = 30;
/**
* CTOR
*/
public CalendarCoordinate() {
/* Base date is 1989-12-31 0, 0, 0
* It was Sunday and offset 0 will be mapped onto this day.
*/
mBaseDate.set(Calendar.MILLISECOND, 0);
mBaseDate.set(1989, 12, 31, 0, 0, 0);
mBaseDateInMillis = mBaseDate.getTimeInMillis();
Log.v(TAG, "BaseDate:" + mBaseDate.toString());
}
/**
* Compute DATE from Y-Offset
* @param yOffset
* @return
*/
public Calendar dateFromYOffset(int yOffset) {
long nthWeeks = yOffset / mWeekHeight;
long millsSinceBaseDate = nthWeeks * ONEWEEK_IN_MILLISECONDS;
mDate.clear();
mDate.set(Calendar.MILLISECOND, 0);
mDate.setTimeInMillis(mBaseDateInMillis + millsSinceBaseDate);
/* We SHOULD call to update mDate internal data structure.
* Java is really strange for this thing
**/
mDate.getTimeInMillis();
return mDate;
}
/**
* Compute Y-Offset from DATE
* @param date
* @return
*/
public long yOffsetFromDate(Calendar cal) {
long mills = cal.getTimeInMillis();
long nthWeeks = (mills - mBaseDateInMillis)/ONEWEEK_IN_MILLISECONDS;
return nthWeeks * mWeekHeight;
}
}
有人能帮助我吗?我不是一个很好的Java程序员。
Anybody can help me? I'm not a good Java programmer.
这个说法混淆了我:
/* I expect mBaseDate == mAnotherDate.
* but it was different.
*/
您实际上是试图通过做比较,以检查是否相等: 如果(mBaseDate == mAnotherDate){的System.out.println(他们都一样); }
Are you actually trying to check for equality by doing the comparison: if (mBaseDate == mAnotherDate) { System.out.println("They are the same"); }
如果是这样,您的问题是,你误会了==操作符在Java中是如何工作的。它比较的参考,而不是比较底层对象数据,并且因为这些是不同的对象(具有相同的值),将永远是假的。对于更详细信息,请参见 Java的注意事项比较符。
If so, your issue is that you are misunderstanding how the "==" operator works in Java. It compares references, rather than comparing the underlying object data, and since these are different objects (with the same values) that will always be false. For a lot more details, see the Java Notes on comparison operators.
此外,这些行看起来真的很可疑的对我说:
Also, these lines look really suspicious to me:
/* We SHOULD call to update mDate internal data structure.
* Java is really strange for this thing
**/
mDate.getTimeInMillis();
如果机器人有一个要求,你做的这个错误,我真的很惊讶,但我想一切皆有可能。什么样的问题,你有没有这个电话吗?
I would really be surprised if Android had a bug requiring you to do this, but I guess anything is possible. What kind of problems do you have without this call?