多个自定义视图的同步滚动
Synchronized scrolling of multiple custom views
我有自定义视图,它绘制比例尺并处理触摸事件(该比例尺的水平滚动)。绘图部分:
@Override
public void onDraw(Canvas canvas){
startingPoint = mainPoint;
counter = 0;
int i = 0;
while (startingPoint <= scaleWidth) {
if(i % 4 == 0) {
size = scaleHeight / 4;
if (counter < 24) {
counter = counter + 1;
} else {
counter = 1;
}
String c = Integer.toString(counter);
canvas.drawText(c, startingPoint, endPoint - (size + 20), textPaint);
} else {
if(i % 2 == 0) {
size = scaleHeight / 8;
} else {
size = scaleHeight / 16;
}
}
if(startingPoint >= closest) {
//метки шкалы
canvas.drawLine(startingPoint, endPoint - size, startingPoint, endPoint, rulerPaint);
}
startingPoint = startingPoint + pxmm;
i = i + 1;
}
}
和触摸事件:
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
float x = event.getX();
prevx = x;
System.out.println(x);
break;
case MotionEvent.ACTION_MOVE:
float z = event.getX();
float dist = z - prevx;
mainPoint = prevsp + dist;
closest = mainPoint - ((int)(mainPoint / pxmm)) * pxmm;
break;
case MotionEvent.ACTION_UP:
float y = event.getX();
prevsp = mainPoint;
break;
}
invalidate();
return true;
}
在 activity_main.xml 中,我粘贴了此视图的两个副本:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center|top">
<net.manualuser.calibr.TimeScale
android:id="@+id/my_scale"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white" />
<net.manualuser.calibr.TimeScale
android:id="@+id/my_scale1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white" />
我应该怎么做才能同步这两个视图,以便在滚动时缩放另一个视图同时移动。如果我是正确的,我需要在 MainActivity 中为我的自定义视图设置 OnTouchListener:
TimeScale defScale = (TimeScale)findViewById(R.id.my_scale);
TimeScale defScale1 = (TimeScale)findViewById(R.id.my_scale1);
defScale.setOnTouchListener(this);
defScale1.setOnTouchListener(this);
并在 onTouch 方法(在 MainActivity 中)中编写一些代码来同步它们。但我现在知道我该怎么做了?
为了让它工作,我需要在 MainActivity 的 onTouch 中将事件传递给我的两个视图:
public boolean onTouch(View v, MotionEvent event){
defScale.onTouchEvent(event);
defScale1.onTouchEvent(event);
return false;
}
我有自定义视图,它绘制比例尺并处理触摸事件(该比例尺的水平滚动)。绘图部分:
@Override
public void onDraw(Canvas canvas){
startingPoint = mainPoint;
counter = 0;
int i = 0;
while (startingPoint <= scaleWidth) {
if(i % 4 == 0) {
size = scaleHeight / 4;
if (counter < 24) {
counter = counter + 1;
} else {
counter = 1;
}
String c = Integer.toString(counter);
canvas.drawText(c, startingPoint, endPoint - (size + 20), textPaint);
} else {
if(i % 2 == 0) {
size = scaleHeight / 8;
} else {
size = scaleHeight / 16;
}
}
if(startingPoint >= closest) {
//метки шкалы
canvas.drawLine(startingPoint, endPoint - size, startingPoint, endPoint, rulerPaint);
}
startingPoint = startingPoint + pxmm;
i = i + 1;
}
}
和触摸事件:
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
float x = event.getX();
prevx = x;
System.out.println(x);
break;
case MotionEvent.ACTION_MOVE:
float z = event.getX();
float dist = z - prevx;
mainPoint = prevsp + dist;
closest = mainPoint - ((int)(mainPoint / pxmm)) * pxmm;
break;
case MotionEvent.ACTION_UP:
float y = event.getX();
prevsp = mainPoint;
break;
}
invalidate();
return true;
}
在 activity_main.xml 中,我粘贴了此视图的两个副本:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center|top">
<net.manualuser.calibr.TimeScale
android:id="@+id/my_scale"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white" />
<net.manualuser.calibr.TimeScale
android:id="@+id/my_scale1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white" />
我应该怎么做才能同步这两个视图,以便在滚动时缩放另一个视图同时移动。如果我是正确的,我需要在 MainActivity 中为我的自定义视图设置 OnTouchListener:
TimeScale defScale = (TimeScale)findViewById(R.id.my_scale);
TimeScale defScale1 = (TimeScale)findViewById(R.id.my_scale1);
defScale.setOnTouchListener(this);
defScale1.setOnTouchListener(this);
并在 onTouch 方法(在 MainActivity 中)中编写一些代码来同步它们。但我现在知道我该怎么做了?
为了让它工作,我需要在 MainActivity 的 onTouch 中将事件传递给我的两个视图:
public boolean onTouch(View v, MotionEvent event){
defScale.onTouchEvent(event);
defScale1.onTouchEvent(event);
return false;
}