1. 程式人生 > >實現在ScrollView中拖動控制元件與按圖片比例動態控制佈局大小

實現在ScrollView中拖動控制元件與按圖片比例動態控制佈局大小

以下貼出原始碼

主檔案:

package com.example.test3;

import java.io.IOException;
import java.io.InputStream;

import com.example.test3.MainActivity;
import com.example.test3.R;

import android.support.v7.app.ActionBarActivity;
import android.annotation.SuppressLint;
import android.app.ActionBar.LayoutParams;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;


public class MainActivity extends ActionBarActivity {
	double HW;
	double screenHeight;
	double screenWidth;
	TextView tv1;
	SharedPreferences sp;
	
	
	final String IMAGE_TYPE = "image/*";

    final int IMAGE_CODE = 0;   //這裡的IMAGE_CODE是自己任意定義的
	
	
	
	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Button addPic=(Button) findViewById(R.id.button1);
        addPic.setOnClickListener(listener);
        
        
        screenHeight = this.getWindowManager().getDefaultDisplay()
				.getHeight();
		screenWidth = this.getWindowManager().getDefaultDisplay()
				.getWidth();

		
		//增加可拖動控制元件	
 		tv1 = ( TextView ) findViewById(R.id.textView11);
	    MoveWidget(tv1);
    }
	
	private OnClickListener listener=new OnClickListener(){

	    @Override
	    public void onClick(View v) {
	        // TODO Auto-generated method stub
	        
	        
	        Button btn=(Button) v;
	        
	        switch(btn.getId()){
	        
	        case R.id.button1:
	            setImage();
	            break;

	        }
	        
	    }

	    

	    private void setImage() {
	        // TODO Auto-generated method stub
	        //使用intent呼叫系統提供的相簿功能,使用startActivityForResult是為了獲取使用者選擇的圖片

	        Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT);

	        getAlbum.setType(IMAGE_TYPE);

	        startActivityForResult(getAlbum, IMAGE_CODE);
	        
	        
	    }};

	     @SuppressLint("NewApi") protected void onActivityResult(int requestCode, int resultCode, Intent data){

	            if (resultCode != RESULT_OK) {        //此處的 RESULT_OK 是系統自定義得一個常量

	                Log.e("TAG->onresult","ActivityResult resultCode error");

	                return;

	            }

	        

	            Bitmap bm = null;

	        

	            //外界的程式訪問ContentProvider所提供資料 可以通過ContentResolver介面

	            ContentResolver resolver = getContentResolver();
	            

	            //此處的用於判斷接收的Activity是不是你想要的那個

	            if (requestCode == IMAGE_CODE) {

	                try {

	                    Uri originalUri = data.getData();        //獲得圖片的uri

	        

	                    bm = MediaStore.Images.Media.getBitmap(resolver, originalUri);
//	                  這裡開始的第二部分,獲取圖片的路徑:

	                    

	                    String[] proj = {MediaStore.Images.Media.DATA};

	        

	                    //好像是android多媒體資料庫的封裝介面,具體的看Android文件

	                    Cursor cursor = managedQuery(originalUri, proj, null, null, null);

	                    //按我個人理解 這個是獲得使用者選擇的圖片的索引值

	                    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);

	                    //將游標移至開頭 ,這個很重要,不小心很容易引起越界

	                    cursor.moveToFirst();

	                    //最後根據索引值獲取圖片路徑

	                    String path = cursor.getString(column_index);
	            		//設定各個佈局大小適應手機螢幕
	                  
	                    HW=(1f*bm.getHeight())/(1f*bm.getWidth());
	    				LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
	    						(int) (this.screenWidth* 1f + 0.5f),
	    						//這裡用寬去乘HW得到的不知道為什麼是錯誤數值,對JAVA浮點運算不了解
	    		                (int) (this.screenWidth*HW * 1f + 0.5f));
	    				LinearLayout ll=(LinearLayout)findViewById(R.id.LinearLayout1);
	    				ll.setLayoutParams(params);
	    				//這裡有BUG,華為機子用setBackground代替setBackgroundDrawable直接掉線
	    				ll.setBackgroundDrawable(Drawable.createFromPath(path));//
	    				Toast.makeText(this, ""+bm.getWidth()+bm.getHeight()+HW, Toast.LENGTH_LONG).show();
	                   
	                }catch (IOException e) {

	                    Log.e("TAG-->Error",e.toString());

	                }
	            }
	            
	     }
	     
	     

	     
	     
	     //移動控制元件函式
	     void MoveWidget(final TextView tv){
	 		sp = getSharedPreferences( "config" , Context.MODE_PRIVATE );
	 		
	 		int lastx = sp.getInt( "lastx" , 0 );
	 		int lasty = sp.getInt( "lasty" , 0 );

	 		
	 		tv.setOnTouchListener( new View.OnTouchListener(){
	 			int	startX;
	 			int	startY;

	 			@Override
	 			public boolean onTouch( View v, MotionEvent event ) {
	 				MyScrollView sv=(MyScrollView) findViewById(R.id.scrollView1);
	 				switch ( event.getAction() ) {
	 				case MotionEvent.ACTION_DOWN:
	 					sv.requestDisallowInterceptTouchEvent(true);  
	 					this.startX = ( int ) event.getRawX();
	 					this.startY = ( int ) event.getRawY();
	 					break;
	 				case MotionEvent.ACTION_MOVE:
	 					sv.requestDisallowInterceptTouchEvent(true);  
	 					int newX = ( int ) event.getRawX();
	 					int newY = ( int ) event.getRawY();

	 					int dx = newX - this.startX;
	 					int dy = newY - this.startY;

	 					
	 					int l = tv.getLeft();
	 					int r = tv.getRight();
	 					int t = tv.getTop();
	 					int b = tv.getBottom();

	 					int newt = t + dy;
	 					int newb = b + dy;
	 					int newl = l + dx;
	 					int newr = r + dx;

	 					if ( ( newl < 0 ) || ( newt < 0 )
	 							|| ( newr > screenWidth )
	 							|| ( newb > screenHeight ) ) {
	 						break;
	 					}
	 					
	 					tv.layout( newl , newt , newr , newb );
	 					this.startX = ( int ) event.getRawX();
	 					this.startY = ( int ) event.getRawY();

	 					break;
	 				case MotionEvent.ACTION_UP:
	 					int lastx = tv.getLeft();
	 					int lasty = tv.getTop();
	 					Editor editor = sp.edit();
	 					editor.putInt( "lastx" , lastx );
	 					editor.putInt( "lasty" , lasty );
	 					editor.commit();
	 					break;
	 				case MotionEvent.ACTION_CANCEL:
	 					 sv.requestDisallowInterceptTouchEvent(true);  
	 				}
	 				return true;
	 			}
	 		} );
	 	}

	    
	    
	    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

自己重寫的ScrollView(便於之後擴充套件功能):
package com.example.test3;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ScrollView;
//重寫ScrollView方法
public class MyScrollView extends ScrollView{

	public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

	public MyScrollView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public MyScrollView(Context context) {
		super(context);
	}
}

最後是XML佈局檔案:
 <com.example.test3.MyScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/scrollView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
    	tools:context="com.example.test3.MainActivity" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:orientation="vertical" >

            <LinearLayout
                android:id="@+id/LinearLayout1"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@drawable/personphoto"
                android:orientation="vertical" >

                <TextView
                    android:id="@+id/textView11"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="TextView"
                    android:textSize="25dp" />
            </LinearLayout>

            <Button
                android:id="@+id/button1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Button" />

            <TextView
                android:id="@+id/TextView01"
                android:layout_width="fill_parent"
                android:layout_height="50px"
                android:gravity="center"
                android:text="This is textView." >
            </TextView>
        </LinearLayout>
    </com.example.test3.MyScrollView>


相關推薦

實現在ScrollView控制元件圖片比例動態控制佈局大小

以下貼出原始碼 主檔案: package com.example.test3; import java.io.IOException; import java.io.InputStream; import com.example.test3.MainActivity;

QT 怎樣使得控制元件 介面等比例變化

轉自:https://github.com/exoticknight/blog-post/blob/master/python-with-Qt-application-development/python%20%C3%97%20Qt%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91

半透明視窗顯示標準控制元件控制元件文字不透明)的實現方案(附原始碼)

原文 http://blog.csdn.net/harbinzju/article/details/7907127 和大家分享一下在半透明視窗中顯示標準控制元件的實現方案。通過層疊視窗可以簡單實現半透明與不規則形狀視窗的效果,但在其上顯示標準控制元件(控制元件與文字不

【轉】WPF自定義控制元件樣式(11)-等待/忙/正在載入狀態-控制元件實現

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。   本文主要有三種實現方式: 簡單忙碌狀態控制元件BusyBox; Win8/win10效果忙碌狀態控制元件ProgressRing; 彈出非同步等待框WaitingB

windows檔案到瀏覽器,實現自動上傳 -- Java

 //拖動License檔案到瀏覽器中,自動讀取檔案並上傳var dropbox = $("body")[0];dropbox.addEventListener("dragenter", function(e){   e.stopPropagation();   e.preventDefault();},

Unity的簡單實現(UGUI以及3D物體)

拖動的基本程式碼如下 [RequireComponent(typeof( RectTransform))] using UnityEngine; using System.Collections; u

MFC製作各種介面,像單文件那樣,可以工具條的介面能放其它控制元件嗎?

我新建一個單文件介面後,不想要那上面的view類,我想在客戶區自己新增一些控制元件上去。怎麼弄呀?? 新建的單文件程式,在資源管理器中只能看到About對話方塊,那個單文件怎麼看不見呢?? 有關於介面程式設計方面的資料

GTK+2.0 的容器控制元件佈局技巧

簡介 GTK+(GIMP TOOLKIT),是一個跨平臺的圖形介面(GUI)開發工具,是目前LINUX作業系統中較常用的圖形介面開發工具之一,它採用一種非常有特色的面向物件的C語言開發框架(C Framework),應用它可以輕鬆的在LINUX系統平臺的X WINDOW環境下開發出漂亮的圖形介面應用程式。直

Unity實現揹包物品和更換位置

using UnityEngine; using System.Collections; using UnityEngine.UI; using UnityEngine.EventSystems; public class PointMoveContro

C#開發PACS醫學影像處理系統(九):序列控制元件

1.先看結構: 建立WPF使用者控制元件:YourTab 建立WPF使用者控制元件:YourItem  建立選項卡時迴圈新增item,並設定序列縮圖到控制元件和非同步下載的進度條, 1個病人1個或多個Study檢查,1個Study檢查1個選項卡,併為每個選項卡新增自定義關閉按鈕   &

qt 畫多邊形(實現鼠標節點)

開始 ack set eee del upd tip update lob ---恢復內容開始--- 2018-01-06 這個小例子實現了移動鼠標,鼠標的坐標信息跟隨鼠標移動,多邊形的實現,鼠標點擊可以拖動多邊形點的位置,(其中有個問題?我在QMainWi

正交相機下實現滾輪按鈕,滾動滾輪縮放的功能

pix spa serial ext 分享 內容 onu bject 開始 實現了一個功能,鼠標滾輪鍵按下可以拖動視野內的物體全體(其實是相機自己在移動),滾動滾輪可以縮放內容(其實是改變相機視野大小) 效果如下 代碼奉上 1 using UnityE

C#Form.SplitContainer清除控制元件textbox值(窗體.容器.控制元件

文章目錄 問題背景 問題程式碼 問題解決 正確清除程式碼 問題延申 問題背景 早上在完善不確定度計算器時,想要清空實驗資料輸入時所有textbox控制元件值。 問題程式碼

Android使用ImageView控制元件顯示網路圖片

在android4.0以後的版本中,為了使得主介面流暢,所以設定了不允許在主執行緒中訪問網路,為了安全,又不允許在其它執行緒中訪問控制元件,這樣就造成了ImageView等需要使用網路的控制元件更新時的問題,本文以Handler+Runnable的方式實現了ImageView控制元件顯示網路圖片.

重繪ListCtrl增加子控制元件Edit是,在父控制元件失去焦點時,子控制元件不進行隱藏

問題:現在有一個listctrl控制元件,需要在某一列上新增一個子控制元件edit。當點選子控制元件(edit)時,子控制元件顯示出來,父控制元件(ListCtrl)已經失去焦點了。此時,要是滑鼠點選的位置不在該控制元件內,edit處於顯示狀態,父控制元件(ListCtrl)是失去焦點狀態。

MFC OnPaint控制元件繪圖,覆蓋重疊的控制元件

對話方塊上又兩個控制元件,一個static控制元件SS_BITMAP屬性,用來繪圖(canvas),一個static控制元件SS_BITMAP屬性,用來顯示圖片(tool),tool和canvas有重疊部分,為了使canvas在重新整理後不至於消失,我在OnPaint中採用雙緩衝繪圖方式重新整理內容

個人筆記005--原生JS實現簡單的滑塊驗證

早上起來後瀏覽網站時看到別人的拖動滑塊驗證,就想著做一個demo,等到有時間把這個優化到到現在的專案(用的是圖片驗證碼)。以下程式碼就是百度之後再修改一下的: <!DOCTYPE html> <html> <head> <meta charset

PowerBuilder資料視窗控制元件資料庫有關的函式

本節介紹的主要內容如下: · 與資料庫有關的函式 · 行操作 · 列操作 · 資料操作 PowerBuilder為資料視窗控制元件提供了豐富的函式,這些函式使使用者能夠在使用資料視窗控制元件時得心應手。 與資料庫有關的函式 這類函式完成與資料庫有關的功能。 一、連線資料庫 連線資料庫也就是指定事務物

事件分發 解決header子控制元件控制元件的衝突

父控制元件listview佈局 <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.

常用控制元件02(圖片進度條)

案例一:訊息提示框 1. Toast(吐絲框) 1.1 Toast是Android中的一種簡易的訊息提示框 1.2 使用這個類的最簡單的方法是呼叫靜態方法構造您所需要的一切,並返回一個新的Toast物件。 Toast toast=To