Normale画面の高さの2倍(960ディップ)のImageViewがあります。画面上で上下にきれいにスクロールしたいと思います。画面の下部にボタンが含まれている必要があります。 ScrollViewとImageviewsのさまざまな組み合わせを試しましたが、成功しませんでした。また、結果なしで:isScrollContainer属性を考えました。誰もこれを行う方法を知っていますか?乾杯、ルカ
@ cV2そのコードをありがとう。必要な方向に進んでくれました。これは、画像の端でスクロールを停止する修正版です...
// set maximum scroll amount (based on center of image)
int maxX = (int)((bitmapWidth / 2) - (screenWidth / 2));
int maxY = (int)((bitmapHeight / 2) - (screenHeight / 2));
// set scroll limits
final int maxLeft = (maxX * -1);
final int maxRight = maxX;
final int maxTop = (maxY * -1);
final int maxBottom = maxY;
// set touchlistener
ImageView_BitmapView.setOnTouchListener(new View.OnTouchListener()
{
float downX, downY;
int totalX, totalY;
int scrollByX, scrollByY;
public boolean onTouch(View view, MotionEvent event)
{
float currentX, currentY;
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
downX = event.getX();
downY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
currentX = event.getX();
currentY = event.getY();
scrollByX = (int)(downX - currentX);
scrollByY = (int)(downY - currentY);
// scrolling to left side of image (pic moving to the right)
if (currentX > downX)
{
if (totalX == maxLeft)
{
scrollByX = 0;
}
if (totalX > maxLeft)
{
totalX = totalX + scrollByX;
}
if (totalX < maxLeft)
{
scrollByX = maxLeft - (totalX - scrollByX);
totalX = maxLeft;
}
}
// scrolling to right side of image (pic moving to the left)
if (currentX < downX)
{
if (totalX == maxRight)
{
scrollByX = 0;
}
if (totalX < maxRight)
{
totalX = totalX + scrollByX;
}
if (totalX > maxRight)
{
scrollByX = maxRight - (totalX - scrollByX);
totalX = maxRight;
}
}
// scrolling to top of image (pic moving to the bottom)
if (currentY > downY)
{
if (totalY == maxTop)
{
scrollByY = 0;
}
if (totalY > maxTop)
{
totalY = totalY + scrollByY;
}
if (totalY < maxTop)
{
scrollByY = maxTop - (totalY - scrollByY);
totalY = maxTop;
}
}
// scrolling to bottom of image (pic moving to the top)
if (currentY < downY)
{
if (totalY == maxBottom)
{
scrollByY = 0;
}
if (totalY < maxBottom)
{
totalY = totalY + scrollByY;
}
if (totalY > maxBottom)
{
scrollByY = maxBottom - (totalY - scrollByY);
totalY = maxBottom;
}
}
ImageView_BitmapView.scrollBy(scrollByX, scrollByY);
downX = currentX;
downY = currentY;
break;
}
return true;
}
});
私はそれが少し洗練される可能性があると確信していますが、それはかなりうまく機能します。 :)
私はこのコードをずっと探していたので、この素晴らしいコードの平和を共有したかったのです。
このコードは、バックエンドにxmlファイルを持つアクティビティからのものです含む an ImageView 'img'と呼ばれます
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:id="@+id/img"
Android:scaleType="center"
Android:background="#fff"
Android:src="@drawable/picName"
/>
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.xml_name_layout);
final ImageView switcherView = (ImageView) this.findViewById(R.id.img);
switcherView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View arg0, MotionEvent event) {
float curX, curY;
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mx = event.getX();
my = event.getY();
break;
case MotionEvent.ACTION_MOVE:
curX = event.getX();
curY = event.getY();
switcherView.scrollBy((int) (mx - curX), (int) (my - curY));
mx = curX;
my = curY;
break;
case MotionEvent.ACTION_UP:
curX = event.getX();
curY = event.getY();
switcherView.scrollBy((int) (mx - curX), (int) (my - curY));
break;
}
return true;
}
});
}
私のために完璧に仕事をしました... 水平および垂直スクロールを含む(有効)
マイナス面は...画像の端をスクロールできますが...これは私にとっては問題ありません。そして、この機能を簡単に実装することができます:)
がんばって
これは私がそれを修正した方法です:p
<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:scrollbarAlwaysDrawVerticalTrack="true" >
<ImageView
Android:contentDescription="Specs"
Android:adjustViewBounds="true"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:scrollbars="vertical"
Android:src="@drawable/specs" >
</ImageView>
@wirblyあなたのコードを本当にありがとう、それは私が望むように正確に動作します。しかし、最初にコードを読んだとき、定義を忘れていた4つの変数について少し混乱しました。
だから、私はそれを明確にするためにコードの定義を追加したい。
Resources res=getResources();
Bitmap mBitmap = BitmapFactory.decodeResource(res, R.drawable.p_1920x1080);
BitmapDrawable bDrawable = new BitmapDrawable(res, mBitmap);
//get the size of the image and the screen
int bitmapWidth = bDrawable.getIntrinsicWidth();
int bitmapHeight = bDrawable.getIntrinsicHeight();
int screenWidth = this.getWindowManager().getDefaultDisplay().getWidth();
int screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();
役に立てば幸いです。
最も簡単な方法は、webviewを使用して、ローカルのhtmlファイルを介して画像を読み込むことです。この方法では、ズームコントロールを使用する場合に自動的に取得することもできます。大きな画像の場合(幅が1000または3000ピクセルの場合)、Android(Coliris)は、元の画像がシャープで非圧縮)。これは既知の問題です。そのための解決策は、大きな画像を小さなタイルに分割し、html(divまたはテーブル)を介してそれらを再びまとめることです。このアプローチを使用して、地下鉄の地図(画面より大きくスクロール可能)をユーザーに提供します。
WebView webView = (WebView)findViewById(R.id.webView);
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setUseWideViewPort(true);
webView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR);
webView.loadUrl( "content://com.myapp.Android.localfile/sdcard/myappdata/common/mtr_map.html");
これは、特定のケースに依存しますが、ほとんどの場合/「通常のアプリ」で機能する可能性があります。ゲームのスクロール可能な背景として画像について話している場合、それは役に立たないかもしれません。
Htmlファイルの代わりに、画像(png、jpg)を直接読み込むこともできます。ズームコントロールが必要ない場合は、オフにします。
別の方法は、HorizontalScrollView
を作成し、それにimageView
を追加してから、HorizontalScrollView
をScrollView
に追加することです。これにより、上、下、左、右にスクロール
わたしにはできる
<ScrollView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:padding="10dp">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical">
<ImageView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:src="@drawable/img"
Android:scaleType="centerCrop"
Android:adjustViewBounds="true"/>
<Button
style="@style/btn"
Android:id="@+id/btn"
Android:layout_height="60dp"
Android:layout_marginTop="20dp"
Android:background="@drawable/btn"
Android:onClick="click"
Android:text="text" />
</LinearLayout>
</ScrollView>
xさんが上記のように簡単で100%信頼できるソリューションを見つけた(言及した他のコードは一部のデバイスで動作しなかったり壊れたりしたため)Androidで提供されるScrollViewを使用すると、ものの世話
このようなもの
<ScrollView Android:layout_width="fill_parent" Android:id="@+id/scrollView1"
Android:layout_height="wrap_content" Android:layout_alignParentTop="true"
Android:layout_alignParentLeft="true" Android:layout_above="@+id/button1"
Android:layout_alignParentRight="true" Android:scrollbarAlwaysDrawVerticalTrack="true">
<LinearLayout Android:id="@+id/linearLayout1"
Android:layout_width="fill_parent" Android:layout_height="fill_parent" Android:gravity="center_horizontal">
<ImageView Android:src="@Android:drawable/ic_menu_report_image"
Android:layout_height="wrap_content" Android:id="@+id/imageView1"
Android:layout_width="wrap_content"></ImageView>
</LinearLayout>
</ScrollView>
そして、このようなものをoncreateで
if (mImageName != null) {
InputStream is = null;
try {
is = this.getResources().getAssets().open("mathematics/"+mImageName);
} catch (IOException e) {
}
Bitmap image = BitmapFactory.decodeStream(is);
mImageView.setImageBitmap(image);
}
乾杯!