当前位置: 编程技术>移动开发
本页文章导读:
▪2013.11.07 ——— java线程之CLH行列锁 2013.11.07 ——— java线程之CLH队列锁
2013.11.07 ——— java线程之CLH队列锁参考:http://blog.csdn.net/aesop_wubo/article/details/7533186详细解释 见上面的链接,例子如下:package com.lp.lock;
public interface Lo.........
▪ sencha > 轮播图 数量在contrl 统制 sencha > 轮播图 数量在contrl 控制
countrl
photoListTap: function(list, index, node, record) {
if (!this.photoShow) {
this.photoShow = Ext.create('Sencha.view.PhotoShow');
}
var t_id = list.getS.........
▪ 图片的拖拽跟缩放 图片的拖拽和缩放
图片的拖拽很基础也很实用,很多地方用到,直接上干货。MainActivity.java:package com.example.dragzoom;
import android.app.Activity;
import android.graphics.Matrix;
import android.graphics.PointF;
im.........
[1]2013.11.07 ——— java线程之CLH行列锁
来源: 互联网 发布时间: 2014-02-18
2013.11.07 ——— java线程之CLH队列锁
2013.11.07 ——— java线程之CLH队列锁
参考:http://blog.csdn.net/aesop_wubo/article/details/7533186
详细解释 见上面的链接,例子如下:
2013.11.07 ——— java线程之CLH队列锁
参考:http://blog.csdn.net/aesop_wubo/article/details/7533186
详细解释 见上面的链接,例子如下:
package com.lp.lock; public interface Lock { void lock(); void unLock(); }
package com.lp.lock; public class QNode { public volatile boolean locked; }
package com.lp.lock.clh; import java.util.concurrent.atomic.AtomicReference; import com.lp.lock.Lock; import com.lp.lock.QNode; public class CLHLock implements Lock{ AtomicReference<QNode> tail = new AtomicReference<QNode>(new QNode());// ThreadLocal<QNode> mPre;//当前线程的前一个qnode ThreadLocal<QNode> mNode;//当前线程的当前的qnode public CLHLock(){ tail = new AtomicReference<QNode>(new QNode()); mNode = new ThreadLocal<QNode>(){ @Override protected QNode initialValue() { return new QNode(); } }; mPre = new ThreadLocal<QNode>(){ @Override protected QNode initialValue() { return null; } }; } /** * */ @Override public void lock() { QNode lNode = mNode.get();//得到当前线程的qnode lNode.locked = true;//设置为true 告诉其他线程 我准备获得锁 QNode pNode = tail.getAndSet(lNode);//得到前一个获得锁的qnode 并将tail设置我当前qnode,这样下一个线程就会等待本线程释放锁之后 才会执行 形成了队列 己成为队列的尾部 mPre.set(pNode); while(pNode.locked){//等待前一个获得锁的线程释放锁 // System.out.println(Thread.currentThread().getName()); // try { // Thread.sleep(1000); // } catch (InterruptedException e) { // e.printStackTrace(); // } } } @Override public void unLock() { QNode lNode = mNode.get();//得到当前线程的qnode lNode.locked = false;//设置为false 告诉其他线程 我释放了锁 mNode.set(mPre.get());//移除本节点 } }
package com.lp.lock.clh; import com.lp.lock.Lock; public class TestCLHLock { public static void main(String[] args) { final Kfc kfc = new Kfc(); for(int i=0;i<10;i++){ new Thread("eat" + i){ public void run() { while(true){ kfc.eat(); } } }.start(); } } } class Kfc{ private final Lock lock = new CLHLock(); private int i = 0; public void eat(){ try { lock.lock(); System.out.println(Thread.currentThread().getName() + ": " + --i); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }finally{ lock.unLock(); } } public void cook(){ try { lock.lock(); System.out.println(Thread.currentThread().getName() + ": " + ++i); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }finally{ lock.unLock(); } } }
[2] sencha > 轮播图 数量在contrl 统制
来源: 互联网 发布时间: 2014-02-18
sencha > 轮播图 数量在contrl 控制
countrl
photoListTap: function(list, index, node, record) { if (!this.photoShow) { this.photoShow = Ext.create('Sencha.view.PhotoShow'); } var t_id = list.getStore().getAt(index).get('t_id'); this.showPhoto(t_id,this.photoShow); this.getPhotoCard().push(this.photoShow); }, showPhoto: function(t_id,pt){ //操作store var photoShowST = Ext.getStore('PhotoShowST'); photoShowST.getProxy().setExtraParam('t_id', t_id); photoShowST.load(); //\ //操作photoView var count = photoShowST.getAt(0).get('photo_count'); var myitems = []; for(j=0;j<=count;j++){ myitems.push( {xtype: 'image',src: 'http://www.sencha.com/assets/images/sencha-avatar-64x64.png'} ); } pt.setItems(myitems); },
view:
Ext.define('Sencha.view.PhotoShow', { extend: 'Ext.Carousel', xtype: 'photo_show_xx', config: { directionLock: true, direction: 'horizontal', } });
[3] 图片的拖拽跟缩放
来源: 互联网 发布时间: 2014-02-18
图片的拖拽和缩放
图片的拖拽很基础也很实用,很多地方用到,直接上干货。
MainActivity.java:
layout_main.xml:
ps:如果有错误希望不吝赐教。
图片的拖拽很基础也很实用,很多地方用到,直接上干货。
MainActivity.java:
package com.example.dragzoom; import android.app.Activity; import android.graphics.Matrix; import android.graphics.PointF; import android.os.Bundle; import android.view.Menu; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageView; /** * * @author Zls *实现图片的拖拽和缩放,给图片添加onClickListener */ public class MainActivity extends Activity { private ImageView image; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); image = (ImageView) this.findViewById(R.id.image); image.setOnTouchListener(new MyTouchListener()); } public final class MyTouchListener implements OnTouchListener { private int mode = 0; //三种模式表示触摸类型 private static final int DRAG = 1; private static final int ZOOM = 2; private PointF startpPoint = new PointF(), midPoint; //startPoint用来记录拖拽的时候记录第一次拖拽的点,midPoint让图片缩放的时候不移动 private float startDis, endDis; //两者之比表示缩放比例 private Matrix oldMatrix = new Matrix(), newMatrix = new Matrix(); //两个矩阵 @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: //单手指按下表示为拖拽 mode = DRAG; oldMatrix.set(image.getImageMatrix()); startpPoint.set(event.getX(), event.getY()); break; case MotionEvent.ACTION_MOVE: // 手指在屏幕移动,该 事件会不断地触发 if (mode == DRAG) { float dx = event.getX() - startpPoint.x; // 得到在x轴的移动距离 float dy = event.getY() - startpPoint.y; // 得到在y轴的移动距离 newMatrix.set(oldMatrix); // 在没有进行移动之前的位置基础上进行移动 newMatrix.postTranslate(dx, dy); } else if (mode == ZOOM) { // 缩放 endDis = countDis(event); // 结束距离 if (endDis > 10f) { float scale = endDis / startDis; // 得到缩放倍数 newMatrix.set(oldMatrix); newMatrix.postScale(scale, scale, midPoint.x, //应用缩放 midPoint.y); } } break; case MotionEvent.ACTION_UP: //单手指或多手指抬起都恢复初始状态 case MotionEvent.ACTION_POINTER_UP: mode = 0; break; case MotionEvent.ACTION_POINTER_DOWN: //多手指按下 mode = ZOOM; startDis = countDis(event); if (startDis > 10f) { midPoint = midPoint(event); } break; } image.setImageMatrix(newMatrix); //让image显示最新的矩阵位置和大小,不执行则以上的触摸事件就无效鸟 return true; } } private static PointF midPoint(MotionEvent event) { float dx = (event.getX(1) + event.getX(0)) / 2; float dy = (event.getY(1) + event.getY(0)) / 2; return new PointF(dx, dy); } // private static float countDis(MotionEvent event) { float a = event.getX(1) - event.getX(0); float b = event.getY(1) - event.getY(0); float c = (float) Math.sqrt(a * a + b * b); return c; } @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; } }
layout_main.xml:
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <ImageView android:id="@+id/image" android:layout_width="fill_parent" android:layout_height="fill_parent" android:scaleType="matrix" android:src="/blog_article/@drawable/luobing/index.html"/> </RelativeLayout>
ps:如果有错误希望不吝赐教。
最新技术文章: