问题
I would like to make a TextView
that can change the size of it's text based on pinch zooming. The TextView
is inside a ScrollView
. I've got the TextView
to zoom when pinching BUT only when you move your fingers almost perfectly horizontally. If there is a vertical component to the pinch-zoom it defaults to scrolling instead of zooming
Is there a way to disable the scrolling of the ScrollView
when there is more than 1 pointer on it then re-enable scrolling when the pointer count returns to 1 or 0? Is the best way to create a CustomScrollView
widget or is there an easier way?
回答1:
Inspired by this answer https://stackoverflow.com/a/14577399/2014236
scaleGD = new ScaleGestureDetector(this, new simpleOnScaleGestureListener());
mTextView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getPointerCount() == 1){
//stuff for 1 pointer
}else{ //when 2 pointers are present
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// Disallow ScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(true);
scaleGD.onTouchEvent(event);
break;
case MotionEvent.ACTION_MOVE:
// Disallow ScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(true);
scaleGD.onTouchEvent(event);
break;
case MotionEvent.ACTION_UP:
// Allow ScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(false);
break;
}
}
return true;
}
});
EDIT:
//later in the code
public class simpleOnScaleGestureListener extends SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
float size = codedText.getTextSize();
float factor = detector.getScaleFactor();
int increase = 0;
if(factor > 1.0f)
increase = 2;
else if(factor < 1.0f)
increase = -2;
size += increase;
codedText.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
plainText.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
//remembering the favourable text size
Editor edit = sp.edit();
edit.putFloat("TXTSIZE", size);
edit.commit();
return true;
}
}
By no means perfect but does a good enough job for me - feel free to make improvements.
回答2:
I think it is simpler to use:
textView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
if(event.getPointerCount() == 1) {
Log.d("Scroll","1-pointer touch");
v.getParent().requestDisallowInterceptTouchEvent(false);
}
if(event.getPointerCount() == 2){
Log.d("Zoom","2-pointer touch");
v.getParent().requestDisallowInterceptTouchEvent(true);
}
return false;
}
});
回答3:
Here is a nice a sample code from android-dev blog that shows how to implement finger pinch.
Android touch example
You cannot disable scroll feature of scroll bar unless you dont override the onTouchEvent method to return false on your condition. Here are few threads that may help you on how to disable scrolling in scroll view.
How to disable scrolling in ScrollView when the viewSwitcher is enabled?
How to disable ScrollView scrolling?
Disable ScrollView Programmatically?
Thank you :)
来源:https://stackoverflow.com/questions/23848884/zoomable-textview-in-scrollview