スクロールと正しい場所でのタッチ信号のピックアップの両方で、多くの問題が発生しています。
基本的にアプリケーションは次のとおりです。
ViewPager ->
Fragment ->
ScrollView ->
LinearLayout ->
Lots of dynamically added customer View objects
フラグメント xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/transaction_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/add_new_transaction"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/AddNewTransaction" />
<com.company.application.TransactionScroller
android:id="@+id/transaction_scroller"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:fillViewport="true" >
<com.company.application.TransactionGroup
android:id="@+id/transaction_list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="fill"
android:orientation="vertical" >
</com.company.application.TransactionGroup>
</com.company.application.TransactionScroller>
</LinearLayout>
TransactionScroller が ScrollView である場合、TransactionGroup は LinearLayout です。ビュー オブジェクトはカスタム描画され、次のことを行います。
@Override
protected void onMeasure( int widthMeasureSpec, int heightMeasureSpec )
{
// Try for a width based on our minimum
setMeasuredDimension( width, height ) ;
}
@Override
public boolean onTouchEvent( MotionEvent event )
{
Toast.makeText( getContext(), "Grid", Toast.LENGTH_SHORT ).show() ;
return true ;
}
public void draw( Canvas canvas )
{
if( tmpBmp.isRecycled() ||
tmpBmp.getWidth()!=canvas.getWidth() ||
tmpBmp.getHeight()!=canvas.getHeight() )
{
tmpBmp.recycle();
tmpBmp = Bitmap.createBitmap( canvas.getWidth(), canvas.getHeight(),
Config.ARGB_8888 ) ;
c.setBitmap( tmpBmp ) ;
}
//clear previous drawings
c.drawColor( Color.TRANSPARENT, Mode.CLEAR ) ;
// Draw the background
c.drawRect( spacing, top, width - spacing , bottom, newpaint ) ;
// Draw the lines
for( Line line : lineList )
{
c.drawLine( line.x1, line.y1, line.x2, line.y2, paint ) ;
}
canvas.drawBitmap( tmpBmp, 0, 0, null ) ;
canvas.drawText( String.valueOf( amount ), left, top + ( bottom - top ) /2 , paint);
canvas.drawBitmap(
( ( BitmapDrawable )MainActivity.iconList[ index ].getDrawable() ).getBitmap(),
left + MainActivity.iconList[ index ].getWidth(),
top + ( bottom - top ) /2, paint ) ;
}
1) まず、カスタム ビュー オブジェクトでタッチおよびドラッグ イベントをキャプチャしようとしています。ただし、ScrollView のイベントのみをキャプチャでき、LinearLayout の Down イベントのみをキャプチャでき、カスタム ビューでは何もキャプチャできませんでした。
ScrollView で:
setOnTouchListener( new OnTouchListener()
{
@Override
public boolean onTouch( View view, MotionEvent event )
{
// Only called when touched outside the ScrollView
if( event.getAction() ==
android.view.MotionEvent.ACTION_DOWN )
{
Toast.makeText( getContext(),
"S_Down",
Toast.LENGTH_SHORT ).show() ;
return false ;
}
else if( event.getAction() ==
android.view.MotionEvent.ACTION_UP )
{
Toast.makeText( getContext(),
"S_Up",
Toast.LENGTH_SHORT ).show() ;
return false ;
}
return false;
}
} ) ;
どちらも ScrollView で呼び出されます。ただし、LinearLayout でも同じで、Down イベントのみがキャプチャされ、カスタム ビューでは何もキャプチャされません。フォーカス可能、クリック可能などを設定してみました。
何か案は?
2) 次に、ScrollView にカスタム View オブジェクトしかない場合、スクロールしません。ただし、ボタンなどの何かで満たされている場合はそうです。上記のように、私は onMeasure() を使用しており、これらの値をハードコーディングしようとしましたが、役に立ちませんでした。
前もって感謝します。ジャック